首页 > 代码库 > 建立高性能索引

建立高性能索引

(1)隔离列

如果在查询中没有隔离索引的列,mysql通常不会使用索引。”隔离“列意味着它不是表达式的一部分,也没有位于函数中。

如以下的查询将不会使用actor_id上的索引

 1 mysql>select * from actor where actor_id +1 = 5 

我们虽然很容易的看出actor_id=4但是mysql却不会帮你解方程。

例如

 1 mysql>select ... wher date_col >=TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10 

该查询将会查找date_col值距离今天不超过10天的所有行,但是它不会使用索引,因为使用了TO_DAYS()函数

将以上查询改为如下形式就可以使用索引

 1 mysql>select ... wher date_col >=TO_SUB(CURRENT_DATE,INTERVAL 10 DAY) 

(2)前缀索引和索引选择性

  有时候需要索引很长的列,它会使索引变大并且变慢。一个策略就是模拟哈希索引。但是这样也不够好

  通常可以索引开始的几个字符,而不是全部值,以节约空间并得到很好的性能。这使索引需要的空间变小,但是也会降低选择性。

  列前缀通常可以提供高性能的所需的足够的选择性。如果是BLOB和TEXT列,或者很长的varchar列,就必须定义前缀索引。因为mysql不允许索引

     它们的全文。

例如要为一个表的字段添加前缀索引:

 1 alert table city_demo add key(city(7)) 

 前缀索引能很好的减少索引的大小及提高速度,但是它也有坏处:mysql不能在ORDER BY 或 GROUP BY查询中使用前缀索引,也不能把它们用作覆盖索引

(3)聚集索引

聚集索引不是一种单独的索引类型,而是一种存储数据的方式。当表中有聚集索引的时候,它的数据行实际保存在索引的叶子页中。术语”聚集“指实际的数据行和相关的键值保存在一起。每个表只能有一个聚集索引,因为不能一次把行保存在两个地方。