(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)聚集索引
聚集索引不是一种单独的索引类型,而是一种存储数据的方式。当表中有聚集索引的时候,它的数据行实际保存在索引的叶子页中。术语”聚集“指实际的数据行和相关的键值保存在一起。每个表只能有一个聚集索引,因为不能一次把行保存在两个地方。每个表只可以有一个聚集索引,因为不能一次把行保存在两个地方。由于,存储引擎负责实现索引,,因此不是所有的存储引擎都支持聚集索引。当前SolidDB和InnoDB是唯一支持聚集索引的存储引擎。
Innodb按照主键(pk)进行聚集,这意味着被索引的列其实是主键列。若没有主键,InnoDB会试着使用唯一的非空索引来代替。
聚集主键有助于性能,但是它也能导致严重的性能问题。故应该仔细思索索引。
索引的数据有如下优点:
把相关的数据保存在一起
数据访问快。
使用覆盖索引的查询可以使用包含在叶子节点中的主键值。
缺点:
聚集可以最大限度的提升I/O密集负载的性能。
插入速度严重依赖插入顺序。
更新聚集索引列是昂贵的,因为它强制InnoDB把每个更新的行移到新的位置。
聚集索引可能会比全表扫描慢,尤其是在表存储得比较稀疏或因为分页没有顺序存储的时候。
第二索引可能会比预想的大,因为他们的叶子节点包含了被引用行的主键列。
第二索引访问需要两次索引查找,而不是一次。