面试题答案
一键面试出现多个范围条件的场景
- 多字段不同范围查询:例如在电商系统中,要查询价格在某个区间,同时销量也在某个区间的商品。SQL 语句可能类似
SELECT * FROM products WHERE price BETWEEN 100 AND 200 AND sales_count BETWEEN 1000 AND 2000;
这里price
和sales_count
两个字段都有范围查询条件。 - 单字段不同范围组合:比如在日志表中,要查询时间既不在某个特定短时间段,又不在另一个特定短时间段的记录。
SELECT * FROM logs WHERE log_time NOT BETWEEN '2023 - 01 - 01 08:00:00' AND '2023 - 01 - 01 09:00:00' AND log_time NOT BETWEEN '2023 - 01 - 01 14:00:00' AND '2023 - 01 - 01 15:00:00';
多个范围条件对索引性能产生不良影响的原因
- 索引使用限制:MySQL 的索引使用规则通常是对于多列索引,只有当索引的最左前缀连续匹配时,索引才能有效使用。多个范围条件可能导致索引无法按照预期方式使用。例如对于联合索引
(price, sales_count)
,当有price BETWEEN 100 AND 200 AND sales_count BETWEEN 1000 AND 2000
这样的条件时,在price
范围查询后,sales_count
的范围查询不能很好地利用索引,因为索引是有序的,范围查询后无法再精准定位sales_count
的索引区间,只能进行部分索引扫描甚至全表扫描。 - 索引合并效率低:MySQL 可以尝试使用索引合并策略来处理多个范围条件,但这种策略通常效率不高。索引合并需要在多个索引之间来回切换和扫描,增加了额外的 I/O 和 CPU 开销。例如对于上述电商商品查询,如果
price
和sales_count
分别有单独的索引,MySQL 尝试索引合并时,需要多次从不同索引中获取数据并合并,这比使用一个高效的联合索引性能要差很多。