《高性能MySQL》创建高性能的索引

一、索引是存储引擎用户快速找到记录的一种数据结构。

二、索引的类型:

1. B-Tree索引

2. 哈希索引

3. R-Tree索引

4. 全文索引

三、索引的优点:

1. 索引大大减少了服务器需要扫描的数据量

2. 索引可以帮助服务器避免排序和临时表

3. 索引可以将随机I/O变为顺序I/O

四、索引的缺点:

1. 增加了数据写入、修改、删除的时间,因为需要同时处理索引数据

2. 需要额外的磁盘容量存储索引数据

四、索引的三星系统:

Lahdenmaki & Leach《Relational Database Index Desgin and  the Optimizers》Wiley出版社,介绍了索引的三星系统(three-start system):

1. 索引将相关的记录放到一起则获得一星;

2. 如果索引中的数据顺序和查找中的排列顺序一致则获得二星;

3.如果索引中的列包含了查询中需要的全部列则获得三星。

五、索引的选择性

索引的选择性是指,不重复的索引值(也称为基数,cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性搞得索引可以让Mysql在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

六、B-Tree索引的特性:

支持以下的有效查询:

1. 全值匹配

2. 匹配最左前缀

3. 匹配列前缀

4. 匹配范围值

5. 精确匹配某一列并范围匹配另外一列

6. 只访问索引的查询

索引的限制:

1. 如果不是按照索引的最左列开始查找,则无法使用索引

2. 不能跳过索引中的列

3. 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找

七、聚簇索引

1. 聚簇索引有点:

a, 把相关数据保存在一起

b, 数据访问更快

c, 使用覆盖索引扫描的查询可以直接使用叶节点中的主键值

2. 聚簇索引缺点:

a, 聚簇索引最大限度地提高了IO密集型应用的性能,但如果数据全部都放在内存中,则访问顺序就没那么重要了,聚簇索引也就没有了优势

b, 插入速度严重依赖插入顺序

c, 更新聚簇索引列的代价很高,因为会强制将每个被更新的行一栋到新的位置

d, 基于聚簇索引的表在插入新行,或者主键被更新导致需要一栋行的时候,可能面临页分裂的问题

e, 举出索引可能导致权标扫面变慢,比如行分布稀疏,或者也分类导致数据存储不连续

f, 二级索引可能比想象的要更大,因为二级索引存储的是主键列

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

3. InnoDB支持聚簇索引,InnoDB主键是聚簇索引

八、高性能的索引策略:

1. 查询语句中如果使用不当,Mysql是无法使用已有的索引。例如:是表达式的一部分,或者是函数的参数。

WHERE actor_id + 1 = 5 或者 WHERE TO_DAYS(date_col) <= 10

2.  多列索引(又称联合索引)

a, 排序和分组比查询更重要

b, 不考虑排序和分组,将选择性较高的列放在前面通常是最好的

c, 为了不需要为每个查询建立一个索引,通常会建立一个通用的索引,而这个索引的列顺序可能并不是选择性最高的列放在最前面

d, In不是范围查询,是多次全值匹配,如果In的值很多的话,可能会产生几何级的多次全职匹配,也会导致性能的急速下降

e, 覆盖索引是效率非常高的,它省去了定位行数据和读取行数据的步骤

你可能感兴趣的:(《高性能MySQL》创建高性能的索引)