【问题标题】:Mysql prioritising Primary key over column indexMysql将主键优先于列索引
【发布时间】: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)。还有其他方法可以避免这种情况吗?

【问题讨论】:

标签: mysql indexing query-optimization multi-index


【解决方案1】:

虽然How to hint the index to use in a MySQL select query? 讨论了上述问题,但我建议有更好的方法来优化查询。

INDEX(col_a, col_b, id)

(然后删除INDEX(col_a)

这将使查询运行比强制使用PRIMARY KEY(id) 更快

使用这个索引,优化器会自动使用它并查看正好 1 行,而不是 28M,而不是 22000。

如果 col_bTEXT,则此新索引将不起作用。让我们看看SHOW CREATE TABLE,请解释一下col_b是什么类型的东西。

可能存在数据类型问题。也许您的索引(col_a)有些愚蠢。

【讨论】:

  • 所以基本上我们不想创建另一个索引。查看了您的索引提示,这解决了我们的问题。它开始使用 col_a 索引。 Col_b 是具有 2 个值的整数,这就是我们没有在其上创建索引的原因。
  • 也不确定使用主键创建索引会有多大好处。由于我们不直接对 id 进行过滤,它只会占用额外的索引空间
  • @theprikshit - 复合(多列)索引与每列上的单独索引相同。它通常要好得多。
猜你喜欢
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多