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