【发布时间】: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