为什么mysql优化器选择了聚集索引
本篇内容介绍了“为什么mysql优化器选择了聚集索引”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
通过这个以下这个案例,来说明优化器在选择索引时候的取舍。
查看表结构:
MySQL>showcreatetabletest2\G***************************1.row***************************Table:test2CreateTable:CREATETABLE`test2`(`id`bigint(16)NOTNULLAUTO_INCREMENT,`order_seq`bigint(16)NOTNULL,`order_type`int(11)DEFAULTNULL,`order_flag`int(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`idx_id`(`id`),KEY`idx_id_orderseq`(`id`,`order_seq`))ENGINE=InnoDBAUTO_INCREMENT=15002212DEFAULTCHARSET=utf8mb41rowinset(0.00sec)
查询一:
MySQL>explainselectid,order_seqfromtest2whereid>10000andid<20000;+----+-------------+-------+------------+-------+--------------------------------+-----------------+---------+------+-------+----------+--------------------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+-------+--------------------------------+-----------------+---------+------+-------+----------+--------------------------+|1|SIMPLE|test2|NULL|range|PRIMARY,idx_id,idx_id_orderseq|idx_id_orderseq|8|NULL|18484|100.00|Usingwhere;Usingindex|+----+-------------+-------+------------+-------+--------------------------------+-----------------+---------+------+-------+----------+--------------------------+1rowinset,1warning(0.00sec)
优化器选择idx_id_orderseq,在意料之中,因为查询字段为id,order_seq,可以利用覆盖索引。
查询二:
MySQL>explainselect*fromtest2whereid>10000andid<20000;+----+-------------+-------+------------+-------+--------------------------------+---------+---------+------+-------+----------+-------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+-------+--------------------------------+---------+---------+------+-------+----------+-------------+|1|SIMPLE|test2|NULL|range|PRIMARY,idx_id,idx_id_orderseq|PRIMARY|8|NULL|19122|100.00|Usingwhere|+----+-------------+-------+------------+-------+--------------------------------+---------+---------+------+-------+----------+-------------+
优化器选择了id字段的聚集索引。因为是select *,所以优化器没有选择索引idx_id_orderseq(id,order_seq),id字段的聚集索引(主键)和辅助索引idx_id,优化器是怎么选择的呢?
如果选择辅助索引idx_id,查询到具体id之后,还要回表查到整行的数据信息,虽然id字段是有序的,但是回表查询的数据是无序的,因此变成了磁盘上的离散操作,离散读取比顺序读取性能消耗高的多,所以会选择聚集索引。
“为什么mysql优化器选择了聚集索引”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。