索引基础
索引可以包含⼀列或多列,顺序也⼗分重要,因为MySQL只能使⽤索引的最左前缀列。
索引的类型
BTree索引,⼀般使⽤B-tree索引,MySQL使⽤B+Tree,
B-Tree所有值都是按顺序排序的,B-tree是按照索引列中的数据⼤⼩顺序存储的,所以很适合按照范围来查询。
⾃适应hash索引,具有hash的优势,由MySQL⾃动⽣成
全值匹配
匹配索引的所有列.
匹配最左前缀
只使⽤索引的第⼀列。
匹配列前缀
只匹配某⼀列的开头部分。
匹配范围值
关于B-tree的限制
不是从最左列索引开始查找,不能使⽤索引。
不能跳过索引的列
如果某索引列中有范围查找,那么右边的索引列都不能
使⽤去优化查找
全⽂索引
是⼀种特殊的索引类型,适⽤于match against,⽽不是普通的where条件操作。
使⽤索引的优点
加速查找的过程,减少扫描⾏数,避免排序和临时表,将随机io转换成顺序io。
⾼性能索引的策略
前缀索引和索引的选择性
保证⼀定选择性的前缀索引,但是不能太⻓。
创建前缀索引 :
多列索引
最常⻅的问题就是为每⼀列都创建单独的索引。
使⽤or或者union时,优化器会使⽤多个索引的联合,索引合并说明了索引建⽴得很糟糕,需要耗费⼤量cpu资源,并且优化器会忽略这些查询成本,有时还不如全表扫描。
alter table t1 add key (
city(7))explain看到索引合并,检查语法和表结构。或者关闭索引功能,使⽤ignore index语法忽略索引。
选择合适的索引列顺序
经典法则:将选择性最⾼的索引放在符合索引的最前⾯。(不是全部都适合)
聚簇索引
聚簇表示数据⾏和索引的键值紧凑的存储在⼀起。⼀般根据主键聚簇数据,没有主键innodb选择⼀个⾮空的键,如果没有⾮空键就创建⼀个rowid,但是会导致锁竞争。
聚簇索引的优点:减少io次数,数据访问更快,更新聚簇索引的代价很⾼,会将⾏移动到新的位置。
聚簇索引可能导致全表扫⾯变慢,尤其是⻚⽐较稀疏的情况下。
⼆级索引需要两次查找。
使⽤⾃增主键做聚簇索引主键较好,使⽤uuid,由于uuid是随机的会导致插⼊时性能差。
使⽤uuid的⼀些缺点:
a. 频繁做⻚分裂
b. 造成⼤量随机io
c. 频繁⻚分裂导致⻚间隙,内存碎⽚。
最好插⼊后做⼀次optimize table 调整⼀下⻚。
什么时候按主键顺序插⼊性能较差?
在并发插⼊的情况下,可能间隙锁的竞争⼤。
覆盖索引
索引的叶⼦节点已经包含要查询的数据,就称为索引覆盖。
只有当索引的顺序和order by的顺序完全⼀致才能使⽤索引对结果排序。即使不满⾜索引的最左前缀要求,如果指定了最左的索引列为常数,也可以使⽤索引进⾏排序。
冗余和重复索引
删除冗余的索引,使⽤performance和sys数据库,查看
sys.schema_unused_indexs查看未使⽤的索引。
维护索引和表
由于⼀些硬件错误导致索引出现问题,可以使⽤check table来检查表的问题。