【问题标题】:Use IN for multiple columns primary key对多列主键使用 IN
【发布时间】:2019-02-12 14:27:29
【问题描述】:

我在 MySql 中有两列主键 (id, id2)。 这些 id 有直接联系(对于 id=1 id2=11,对于 id=2 id=22 等)

我想知道是否以下查询:

select * from my_table where id IN (1,2,3..) AND id2 IN (11,22,33..)

其实是破坏性能,虽然是主键。

将在循环中运行单个选择:

select * from my_table where id = 1 AND id2 = 11
select * from my_table where id = 2 AND id2 = 22

... 跑得更快?

我相信答案是肯定的,因为对于每个 id,查询将 id2 与整数列表进行比较。 这是对的吗? 另外,IN 对单列主键有影响吗?

【问题讨论】:

  • id IN (1,2,3) AND id2 IN (11,22,33)(id,id2) IN ((1,11,),(2,22),(3,33)) 之间存在差异。你需要哪一个?
  • 如果 id 和 id2 像你说的那样直接连接,你可以 select * from my_table where id IN (1,2,3..) 因为你已经知道如果 id=1 那么 id2 将是 11
  • 随着 MySQL 的最新版本,优化器可以利用索引来满足“(id,id2) IN ( (1,11), (2,22), (3,33) )”。使用EXPLAIN 查看执行计划,并运行测试以评估实际性能。 (使用代表预期用例的表和值;不要使用琐碎的、不具代表性的集合来衡量性能。)
  • "不要使用琐碎的、非代表性的集合来衡量性能。)" @spencer7593 很好地执行 select * from my_table where id IN (1,2,3..) AND id2 IN (11,22,33..) 与在循环中更改 select * from my_table where id = 1 AND id2 = 11 select * from my_table where id = 2 AND id2 = 22 中的 id ...... 这两种方法都会在应用程序端的内存中导致相同的数据 对吗?.. 此外 MySQL 倾向于用 large 列表严重优化 IN() 运算符。

标签: mysql performance


【解决方案1】:
  • 如果您要检查“大部分”值,那么执行表扫描的单个查询可能是最快的。
  • 如果IN 子句相当短,优化器可能非常有效地在表中跳跃。
  • 如果表很大并且值分散并且需要磁盘命中,那么无论如何它可能会很慢。
  • 粗略地说,10 个 1 行 SELECTs 本质上与单个 SELECT 获取 100 行所需的时间一样长。 (这假设没有 I/O 和良好的索引。)因此,您需要不顾一切地进行单选。

换句话说,你的数据和你的IN列表测试它。我们不能给你一个简单的答案。但请注意,随着表格的增长和/或您的 IN 列表发生变化,性能可能会发生变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多