索引
贴一张小林的图
神马是索引?
索引是帮助MySQL高效获取数据的数据结构(有序)。
索引的分类:
- 按「数据结构」分类:B+树索引、Hash索引、Fulltext索引、R-Tree索引
- 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)。
- 按「字段特性」分类:主键索引、唯一索引、 普通索引、前缀索引
- 按「字段个数」分类:单列索引、联合索引。
按数据结构分类的索引
这里小林coding上说,InnoDB上实际没有HASH索引?说在内存结构中有一个自适应的hash索引。
建表的时候InnoDB根据情况选择列作为索引。
- 有主键就直接主键作为索引键
- 没主键就是第一个不包含null值的唯一列作为索引键
- 都没有,InnoDB会自动生成一个隐藏的自增id列作为索引。 还记得基础篇的MySQL中一行数据是如何存储的吗?其中就有一个隐藏的row_id!
主键索引和二级索引默认都用的是B+树索引。
B+树的优势是树的高度很低,千万级只需要3-4层,磁盘IO少。
什么样的查询才可以用上联合索引?
看了十分钟终于看懂了!
Q1: select*from t table where a > 1 and b = 2
,联合索引(a, b) 哪一个字段用到了联合索引的 B+Tree?
实际上是只有a字段用上了联合索引的。
为什么b字段没能用上联合索引?注意这里是否用上联合索引,和覆盖索引并不是一个概念。 覆盖索引:即查询的字段和联合索引的字段一致,不需要回表查询。
注意,联合索引的排序规则是,在a固定的情况下,b是有序的,因此可以直接快速定位到开始位置;当条件是a>1时,在a>1的范围下,b整体是无序的,所以用不上联合索引,必须挨个扫描看是否符合条件。
索引优化的方法?
- 前缀索引优化
- 覆盖索引优化
- 主键索引自增
- 防止索引失效
从数据页的角度看B+树
xxx
MySQL单表不要超过2000W行,靠谱吗?
靠谱,数据太多的话树的高度增加,不好。