MySQL

2020-02-24  本文已影响0人  王大吉

索引

InnoDB

MySQL5.6版本之后默认引擎是innoDB,以B+树作为索引的数据存储结构。
B+数是以B树为基础的另一种更适合数据库存储的数据结构。

主键索引、非主键索引

像图2,或图3第一个这种,叶子节点上挂载具体数据的索引,被称为主键索引。主键索引又叫聚簇索引

图3 主键索引和非主键索引
图3中,我们用R来表示一条数据,数据至少包含有ID和k两个字段,上面分别有自己的索引。
图3第二个中,以k值做索引,叶子节点上存储的是ID的值,这种被称为非主键索引。
可以看到,真正的数据R本身,是存在主键索引ID的叶子节点上的,在非主键的叶子节点上只存储一个指向ID的指针即可。

假如我们要查找k=5的值,通过k的索引,我们找到k=5的数据的ID=500,然后我们再在ID索引里查找ID=500的数据,最后找到数据R4。 这一过程被称为回表

从图中可以理解到,一个表里主键索引只有一个,非主键索引可以有多个。

在大多数情况下,数据里最好包含一个自增的主键,也就是唯一的聚簇索引。

覆盖索引

上文已经讲过,如果执行select * from T where k=5这一条语句,会先通过k=5的索引查出需要的数据的ID=500,然后回表,在主键索引上查询ID=500的值为R4。

如果是select ID from T where k=5,在第一次查询k=5的索引时,就查出来了ID=500,此时就已经取到了需要的数据,不需要回表,这种情况被称为覆盖索引。覆盖索引是一种常用的性能优化手段。

联合索引,最左前缀法则。

以姓名和年龄做联合索引


图4 联合索引

在图4中,如果查询... like 张%,那么此索引是没问题的,会迅速查到姓张的人。但如果是...age=10... 那么此索引无效,依然会全盘扫描数据。

索引下推

在图4中,查询语句为...name like 张% and age=10...,在MySQL5.6之前,会先查出所有姓张的,然后一个个回表判断age是否=10。5.6引入了索引下推的优化,简单的说就是在查找姓张的数据的时候,直接也判断一下联合索引里的数据age是否等于10。避免了多余的回表。

ACID(原子性、一致性、隔离性、持久性)

隔离性

事务的隔离分级别从松要严可以分为读未提交、读提交、可重复读、串行化。隔离越严,效率越低。

上一篇 下一篇

猜你喜欢

热点阅读