覆盖索引,但是没有最左前缀匹配,性能如何
有一个组合索引 idx on t1(c1, c2); 查询语句 select id, c1 from t1 where c2 = xxx; 这里会用到覆盖索引,但是却是用 c2 做条件查询,这样会全索引扫描吗,数据量大了,性能如何?
有一个组合索引 idx on t1(c1, c2); 查询语句 select id, c1 from t1 where c2 = xxx; 这里会用到覆盖索引,但是却是用 c2 做条件查询,这样会全索引扫描吗,数据量大了,性能如何?
If separate single-column indexes exist on col1 and col2, the optimizer attempts to use the Index Merge optimization (see Section 8.2.1.3, “Index Merge Optimization”), or attempts to find the most restrictive index by deciding which index excludes more rows and using that index to fetch the rows.
https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html
狗尾续貂 , 也请教各位一个问题 , mysql 的分区表如何 ? 目前系统业务量比较大, 想用 mysql 本身的分区表实现类似分表功能.
这个查询毫无疑问(正常情况下)会走你的(c1, c2)索引,前提是你的表可能得不止有 id, c1, c2 这 3 个字段,理由是主键索引的每个页能够存放下的数据行比(c1, c2)索引每个页能存放下的数据行更少,如果扫描主键获取结果,需要扫过更多的数据页,如果扫(c1, c2)索引,尽管没有用上”索引”的查询特性,但是可以通过扫更少的页得到正确结果。
性能的差距 = 主键索引体积 vs (c1, c2)索引体积,当你的表字段越多,越大的时候,差距越明显;反例则是如果表只有 id, c1, c2 三个字段的时候,扫描的时间理论上应该是非常接近的,并且优化器在选择上两个索引都有可能选择使用