假设我们有一个包含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()
吗?
答案 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