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开始排序的
索引的宽度
就是索引查询命中的索引的范围