- 索引是存储引擎用于快速找到记录的一种数据结构。
- 索引可以包含一个列或多个列的值,多个列的话,顺序很关键。
- 大多数索引使用的是B-Tree数据结构,InnoDB则使用的是B+Tree(属于B-Tree变种)。
- B-Tree意味着所有值是按顺序存储的,而且每一个叶子节点到根的距离相同。
DEMO:key(last_name, first_name, dod)
可以使用B-Tree索引的查询类型
- 全值匹配
- 指和索引所有列均进行匹配
- 匹配最左前缀
- 只使用索引的第一列
- 匹配列前缀
- 是匹配开头部分,如last_name like L%匹配L开头的name字段
- 匹配范围值
- 查找last_name在Allen和Barry之间的数据,属于匹配范围
- 精准匹配某一列并范围匹配另外一列
- 精准匹配的列需要在索引中比范围匹配的列要靠前,last_name为Allen,frist_name以字母K开头。
- 覆盖索引
- 查询的内容列都在索引中,查询仅仅需要访问索引,无需访问数据行
B-Tree索引的限制
- 如果不是按照索引的最左列开始查找,则无法使用索引
- 例如DEMO中,无法查找first_name为Bill的人,也无法查找特定生日(dod)的人,因为这两列都不是索引的最左列;同理,无法查找last_name以某个字母结尾的人
- 不能跳过索引中的列
- DEMO中,无法查找last_name=Allen并且特定日期出生的人,没有指定first_name则只能使用到索引的last_name
- 如果查询中有某个列的范围查询,则其右边的列就无法使用索引优化查找
- DEMO中,查询where last_name = 'bla' and first_name like 'J%' and dod = '2019-12-12',这个查询只能用到索引的前两列,因为这里like是一个范围条件 ,如果范围查询的列值有限,建议可以通过使用多个等于条件来代替范围查询,这样就可以用到索引里的多列了
网友评论