建立高性能索引

时间:2021-10-30 19:39:38

(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把每个更新的行移到新的位置。

  聚集索引可能会比全表扫描慢,尤其是在表存储得比较稀疏或因为分页没有顺序存储的时候。

  第二索引可能会比预想的大,因为他们的叶子节点包含了被引用行的主键列。

  第二索引访问需要两次索引查找,而不是一次。