Skip to content

索引

贴一张小林的图 image

神马是索引?

索引是帮助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整体是无序的,所以用不上联合索引,必须挨个扫描看是否符合条件。

索引优化的方法?

  • 前缀索引优化
  • 覆盖索引优化
  • 主键索引自增
  • 防止索引失效

image

从数据页的角度看B+树

xxx

MySQL单表不要超过2000W行,靠谱吗?

靠谱,数据太多的话树的高度增加,不好。

count(*)和count(1)有什么区别?哪个的性能最好?

image

wow!