索引是储存引擎中用于快锁查找记录的一种数据结构服务器
索引类型数据结构
B-Tree对索引是顺序组织存储的,因此很适合查找范围数据。
B-Tree索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于根据最左前缀的查找。
适用场景:优化
1. 全值匹配,和索引中的全部列进行匹配。 2. 匹配最左前缀,只能使用索引的第一列 创建channel_id,ref索引,单独查询channel_id时能够用到索引,单独查询ref时用不到索引,检索了所有数据
3. 匹配列前缀,使用LIKE查询时只能查询以什么开头时才能用到索引,而且只能用到索引第一列 例如创建了name_age(name,age) 的聚合索引,查询以张字开头的姓而且年龄为18的数据时只能用到name索引,而查以辉字结尾的姓别时用不到索引。 创建ref,channel_id的索引,ref使用like查询时扫描了70万行,改成等于查询时扫描了10万行
4. 匹配范围值 当索引中列有范围查找时其后面列也将没法使用到索引 当channel_id使用范围查询时,使用索引检索了全部大于30的channel_id,可是索引第二列的ref没有使用索引
- 哈希索引 哈希索引是基于哈希表实现的。(感受使用场景很少,并且只支持Memory引擎表,略过) - 空间数据索引 - 全文索引 用于查找列中关键词,不是直接比较索引中的值。
索引优化spa
- 当服务器出现对多个索引的相交操做一般须要一个包含查询列的多列索引而不是多个单列索引 - 创建多列索引时将选择性最高的列放入索引的最左边。 - 当数据重复性过高时,例如一张大表中有一半数据都包含着某个值,另外一边包含着另外一个值 这样的列就没有创建因此的必要了。
例如图中channel_id字段在400万数据中有四分之一都是,就算创建索引每次查询也会检索100万条记录。 code
- 当某几个列同时查询的频率很高的时候,能够针对这几个列创建一个全覆盖索引。 - 避免重复顺序索引的建立,会形成索引冗余。 建立一个多列索引,两个单列索引,查询时会使用多列索引而不是两个单列索引
- 尽可能把须要范围查询的列放入多列索引的右面,便于优化器尽量索引大多数的列。