创建高性能的索引笔记
B树索引是按顺序组织的,因此适合查找范围数据
B树索引适合全键值,键值范围和键前缀查找。
全文索引
索引的优点
索引可以让服务器快速地定位到表的指定位置
索引大大减少了服务器需要扫描的数据量
索引可以将随机I/O变为顺序I/O
三星系统原则:
相关的记录放到一起为一星;索引的数据顺序和查找中的排列顺序一致为一星;覆盖索引为一星;
索引的使用是相对的:对于非常小的表,大部分的情况下,简单的全表扫描更高效。
高性能的索引策略
-
独立的列
将建有索引的列单独放在一侧,而不是需要进行某种运算。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数。
-
前缀索引和索引选择性
索引选择性越高越好,如果1000个记录,1000个记录的值都不相同是最优的。
前缀索引的缺点是,无法使用前缀索引进行ORDER BY和GROUP BY,也无法用作覆盖索引。
另:有时也会需要后缀索引,MYSQL不支持,但是可以通过字符串反转后存储,并基于此进行前缀索引,通过触发器进行维护。
聚簇索引
是一种数据存储方式。
InnoDB通过主键聚集数据。
如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,引擎会隐式定义一个主键来作为聚簇索引。
二级索引可能比想象的要大,因为在二级索引的叶子节点包含了引用行的主键列。
尽可能按主键顺序插入数据,并且尽可能地使用单调增加的聚簇键的值来插入新行。
覆盖索引
在extra列可以看到using index的信息。
使用索引扫描来做排序
如果执行计划中的type列为index,说明使用了索引扫描排序。
排序有两种,通过排序操作,或者按索引顺序扫描。
应该避免创建重复索引,发现以后也应该立即移除。
未使用的索引应该删除。
索引和锁
索引可让查询锁定更少的行,从而提高并发性能。、
InnoDB只有在访问行的时候才会对其加锁,而索引可以减少引擎访问的行数,从而减少锁的数量。
5.1之后的版本中,服务器过滤掉行之后就会释放锁。