发布于 

MySQL索引

索引的优点

  • 减少服务器需要扫描的数据量
  • 帮助服务器避免排序 和 临时表
  • 将随机IO变为顺序IO

索引的用处

  • 快速匹配where子句的行

索引的分类

按照结构划分

  • B+tree索引
  • Hash索引:
  • 全文索引

按照数据存贮

  • 聚集索引:叶子节点出来存放了主键索引还有其他列数据。
  • 非聚集索引:叶子节点不存放其他列的数据而是存发存贮数据的文件地址。

辅助索引、二级索引

除了主键索引其他的普通索引,

对于二级索引叶子节点存放的数据是主键(bookmark),需要通过主键再回表查询对于的记录行

回表

假如 index(a),select a,b,c from table where a = 'xxx' 因为表仅有index(a) 那么需要获取b,c字段的话,需要先通过二级索引树获取到主键,再回主键树查询数据。

联合/符合索引

多个列组合的索引

索引覆盖

只查询加了索引的字段,避免回表的IO操作。

自适应Hash索引

MySQL会根据SQL语句的执行次数决定是否需要缓存数据。

索引的创建策略

  • 对于主键:索引列的数据格式尽量小,选择合适的类型做主键
  • 索引列尽量高离散性:选择数据区分度很高的列

前缀索引

对于blob/varchar(10000)很长的字符串,无法建立完整长度的索引,所以只能建立一部分索引。

语法:alter table add index cloumn(length) 其中length指的是需要建立的长度

缺点:无法参与order by/ group by,无法索引覆盖

什么时候需要创建索引?

是否需要作为条件查询 ?需要排序?需要分组?

三星索引

  • 一星(数据聚集性):将相关的记录放在了一起,比如满足了查询了叶子节点数据的聚集性。
  • 二星(顺序性):查询出来的数据和索引的顺序一致的时候。
  • 三星(覆盖索引):查询的列有且仅包含索引列。

具体的SQL优化

减少回表

  • 尽量通过主键索引查询数据
  • 尽量索引覆盖:只查询返回加了索引的字段

回表VS全表扫描怎么选择?

问题

  • 什么事临时表 实际开发中哪些场景使用了临时表?

  • 为什么二级索引(辅助索引)的叶子节点不存放数据?

    减少不必要数据冗余,从而减少索引索占用的空间。

  • 为什么符合索引有最左匹配原则?

    因为b+tree的联合索引的排序规则是先总最左侧的key开始排序的

  • 索引的宽度

    就是索引查询命中的索引的范围