一、索引是存储引擎用户快速找到记录的一种数据结构。
二、索引的类型:
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, 覆盖索引是效率非常高的,它省去了定位行数据和读取行数据的步骤