MySql索引分类:
1)B-Tree
缺点:
- 只能索引列最左边开始
- 不能跳过索引中的列
- 不能优化访问任何在第一个范围条件右边的列
2)哈希索引
只对精确查找有用
缺点:
- 不能进行排序
- 不支持部分键匹配
- 只支持=, in(), <=>相等比较
3)空间数据索引(R-Tree)
和B-Tree不同,这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时,可以任意维度组合查询。
索引优点
- 减少服务器需要扫描的数据量
- 帮助服务器避免排序和临时表
- 将随机I/O变为顺序I/O
使用索引策略
- 独立列
a. 不能是表达式的一部分,也不能是函数的参数 - 保证较高的前缀索引选择性
- 多列索引
a. 在多个列上创建独立的单列索引大部分情况下并不能提高MySql的查询性能
b. 但在MySql5.0和更高版本的MySql中可以使用“索引合并”策略优化查询,使其使用单列索引;但也说明这是一个糟糕的索引设计; - 选择合适的索引列顺序
a. 不考虑排序和分组时将选择性高的列放到索引的最前列 - 聚簇索引
a. InnoDB中支持主键聚集数据,也就是被索引的类就是主键列;
b. 如果没有定义主键,InnoDB选择一个唯一非空索引代替。
c. 最好避免随机主键聚簇索引,自增主键索引最好;
d. 顺序主键在高并发的情况下会有热点问题; - 覆盖索引
a. 索引中包含所有需要查询的字段,就不需要读取数据行,称为覆盖索引