【发布时间】:2017-08-27 00:56:29
【问题描述】:
当使用大的 IN 列表进行 SELECT 时,首先缩小搜索范围会更快吗?
假设:
- id 是主键
- 表格有 2M 行
- @list_of_id 中的 ID 总是靠近在一起,但不是连续的(选择在同一个月左右创建的一组人的子集)
当@list_of_id 长度为 1K、10K 或 100K 时,以下查询应如何执行?
查询 1:
SELECT * FROM people
WHERE id IN (@list_of_id);
查询 2a(先缩小搜索范围):
SELECT * FROM people
WHERE id <= @max_id
AND id >= @min_id
AND id IN (@list_of_id);
查询 2b(可能更慢):
SELECT * FROM people
WHERE MONTH(created) = @month
AND id IN (@list_of_id);
【问题讨论】:
-
您能以
JOIN的身份执行此操作吗? -
很抱歉,您试过了吗?你观察到了什么?如果没有进一步的细节,我们将无法确定性能:是否有指数?还有其他键吗?
id的数据类型是什么? -
如果您想知道哪个更快,全部尝试。无论如何,您都需要 id 上的索引,因此请确保先完成。
-
除非您更改某些默认数据包大小设置,否则查询的大小将受到限制(即,您可能无法在不摆弄数据库/服务器设置的情况下对 100k 个项目执行
IN) .对于所有这些,我会将您的查找 ID 列表放在一个临时表中并执行JOIN。created日期上的索引也可能不是一个坏主意,然后将临时表方法与 2b 结合起来。 -
如何开始生成 id 值列表?
标签: mysql sql select optimization