
文章插图

文章插图
如果数据表定义了主键,那么这个主键索引就是聚集索引,如果没有定义主键,mysql会选择该表的第一个非空唯一的索引构建聚集索引,如果都没有那么mysql会生成一个隐藏的列(6字节的列,并且插入自增)
自增主键会把数据自动向后插入,避免了插入过程中聚集索引节点分裂的问题 。节点分裂会带来大范围的数据物理移动 , 带来磁盘IO的性能损耗,并且我们一般建议尽量不要改动主键,主键的更改也会带来page分裂 , 产生碎片 。
四丶回表查询

文章插图

文章插图
如上图,假如我们有一张表存在三个字段
id,age,name
我们在id上建立了主键索引,这时候id主键索引也是聚集索引,在age上建立了普通索引,这时候age索引就是非聚集索引 。如果我们执行select * from table where age=1
这时候先走age索引(如果数据量较大,数据量少直接全表扫描了)那么会找到对应的主键id , 继续到主键id索引中找到目标数据 , 这个操作叫做回表 。这就是为什么根据主键查找快于根据其他索引列查找 , 因为如果其他索引列没有包含我们
select
语句中需要的列(如果是select id from table where age<10
,那么age索引是可以覆盖到需要的数据的(叶子节点存储了id),那么也不会回表),那么会走主键索引拿到需要的数据,多了一步回表操作 。这里我们也可以看到为什么建议使用
select *
,这意味着查找所有列,如果配合上普通索引,那么大概率这个普通索引不会覆盖到索引列,导致需要回表查询 。并且select*
这种"我全都要"大概率会查询到我们不需要的列 , 造成不必要的网络资源消耗,增加不必要的io,增加不必要的内存消耗 。五丶联合索引

文章插图

文章插图
联合索引是指对表上的多个列建立索引,如上图表存在四个字段
id,address,name,age
,我们在name和age上建立索引,上图我们粗略的展示了联合索引的B+树结构 。我们可以观察到在叶子节点中name是有序的,但是age无序,联合索引是按照索引定义的顺序排序的,这就导致select xxx from table where name='b'
是可以根据上面定义的联合索引查找数据的,但是``select xxx from table where age=12是无法走上面定义的联合索引的 。这就是常说的
最左前缀匹配原则`的原理 。- 联合索引可以减少回表
如果我们执行select age,id from table where name='a' and age=10
,这个时候由于我们定义的聚集索引一级包含了需要的数据就不需要进行回表操作了(这其实也被称为覆盖索引,即非聚集索引中可以查询到全部需要的列 , 那么就不需要走聚集索引回表查询数据)
- 联合索引可以优化排序
上图中的联合索引,我们可以看到,名称相同的节点,其年龄是有序的
也就是说select * from table where name='a' order by age
这个语句将避免多一次的排序操作(select* from table where id=1 order by age
会走主键索引拿到所有符合数据进行排序,这里说的避免一次排序操作指拿到的数据本身就是有序的 所有不需要再次排序)
- 索引下推ICP
全称Index Condition PushDown
,mysql 5.6后支持的一种根据索引进行查询优化的操作 。mysql数据库会在取出所有数据的同时判断是否进行where条件的过滤,将where的部分过滤放在存储引擎层 。
文章插图
mysql5.6之前如果执行select * from table where name like '张%' and age=10
这时候会先从name age
的联合索引中拿到name满足张开头的数据,然后回表,mysql支持ICP后,效果图如下推荐阅读
- 记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节
- 发朋友圈的七种步骤(发朋友圈的细节和技巧)
- 库克首次回应iPhone13的细节_iphone13官方最新消息
- 上官婉儿怎么免伤害连招(上官婉儿怎么玩连招细节)
- 英雄无敌类网游小说推荐 英雄无敌类网游
- 关于劳力士格林尼治可乐圈复刻表做工细节怎么样
- 细节作文800字高中议论文 爱在细节处高中作文800字
- 英雄无敌3历代记是什么 英雄无敌3历代记是什么?
- 梧州藤县男孩走失三天获救,警方披露搜救细节,孩子是如何被找到的?
- 假面骑士空我究极形态和假面骑士ghost无限魂形态哪个厉害?