前缀索引优化

在字符串字段的前几位字符上建立索引

局限性:

覆盖索引优化

含义:指 SQL 中 select 的所有字段,在二级索引 B+Tree 的叶子节点上都能找得到,即从二级索引的 B+Tree 中查询得到记录,而不需要通过聚簇索引查询获得,可以避免回表的操作

比如只需商品的名称、价格时,建立联合索引即 [商品ID、名称、价格] 作为一个联合索引。如果索引中存在这些数据,查询将不会再次检索主键索引,从而避免回表(减少 I/O 操作)

主键索引最好自增

InnoDB 创建主键索引默认为聚簇索引,数据被存放在了 B+Tree 的叶子节点上(叶子节点自动排序)

使用自增主键:每次插入一条新记录,都是追加操作,不需要重新移动数据。

使用非自增主键:由于每次插入主键的索引值都是随机的,因此每次插入新的数据时,就可能会插入到现有数据页中间的某个位置,这将不得不移动其它数据来满足新数据的插入,甚至需要从一个页面复制数据到另外一个页面,我们通常将这种情况称为页分裂页分裂还有可能会造成大量的内存碎片,导致索引结构不紧凑,从而影响查询效率

举个例子,假设某个数据页中的数据是 1、3、5、9,且数据页满了,现在准备插入一个数据 7,则需要把数据页分割为两个数据页

Untitled

出现页分裂时,需要将一个页的记录移动到另外一个页,性能会受到影响,同时页空间的利用率下降,造成存储空间的浪费

而如果记录是顺序插入的,例如插入数据11,则只需开辟新的数据页,也就不会发生页分裂:

Untitled