具有大型WHERE IN()子句的MySQL性能

时间:2017-10-25 20:12:49

标签: php mysql innodb

假设我们有一个包含4列的表格:id (int 11, indexed), title, content, category (varchar 5)

我有一个用户选择一个类别。每个类别最多可包含999个对象。使用SELECT id FROM table WHERE category = ?我得到所有对象的列表。

然后我让用户选择/取消选择一些对象。之后我需要选择剩余所选对象的内容。

现在我的问题如下,使用SELECT content FROM table WHERE id IN($array)时我应该担心性能吗?使用SELECT content FROM table WHERE category = ? AND id IN($array)会更好吗?这里的想法是我在执行IN ...之前将其过滤到999个对象

这有什么意义吗?或者我应该不使用IN()吗?

1 个答案:

答案 0 :(得分:0)

听起来你总是在屏幕上显示content

999是一个列表,可以放在屏幕上。重新考虑你的用户界面。

选择/取消选择时会发生什么?你把content变灰了吗?如果是这样,那就是UI问题,而不是数据库问题。如果您存储当前"选择"的子集,那么存储的方式/位置是什么?并且,您是否希望在每次选择/取消选择后存储它?或者等到他点击"提交"?

换句话说,我不明白为什么这是一个数据库问题。

返回有问题的查询:

INDEX(category)
SELECT ... FROM tbl WHERE category = ...; -- This is optimal

PRIMARY KEY(id)
SELECT ... FROM tbl WHERE id IN (...); -- optimal for an arbitrary set

INDEX(category, id)
SELECT ... FROM tbl WHERE category = ... AND id IN (...)
    -- use this only if you both parts are needed for filtering
    -- not for optimizing