【发布时间】:2021-06-12 16:56:03
【问题描述】:
查询:
select * from table_a where col_a = 'value1' and col_b ='value2' order by id desc limit 1
索引:
col_a 已编入索引,但 col_b 未编入索引。 col_a 具有高基数(2M)
整个表由 28M 行组成。 col_a = 'value1' 的行数为 22,000。
最新的id是28M。 col_a = 'value1' 的最新行的 id 在 25M-25.5M 范围内。
理想情况下,它应该只扫描这 22000 行并给我们结果。但是我们看到mysql正在扫描这3M行(28M - 25M主键id值)然后返回结果。
使用 mysql explain 我们发现如果限制设置为小于 20,则使用 PRIMARY 键,但之后优先使用 user_id。
有没有其他人看到过这种行为?是否可以设置任何标志来避免扫描主键? (我们不想使用force index(col_a_idx)。还有其他方法可以避免这种情况吗?
【问题讨论】:
-
我想你可能正在寻找Index Hints
标签: mysql indexing query-optimization multi-index