MySQL查询优化
问题描述:
这是表结构:MySQL查询优化
for_id
from_id
for_folder
from_folder
deleted
数代表我的ID,这是查询:
SELECT *
FROM poruke_konverzacija
WHERE (
(
for_id =2
AND for_folder = "inbox"
)
OR (
from_id =2
AND from_folder = "inbox"
)
)
AND deleted !=2
我有近50万点的记录表上的当我运行解释,这是我得到:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE poruke_konverzacija ALL obrisano,za_id,od_id NULL NULL NULL 456884 Using where; Using filesort
我已索引for_id fro m_id for_folder from_folder,查询非常慢。有没有其他的方式来获得相同的结果?
答
索引也被删除。还有......联盟可能会更好,运行两个并发查询而不是一个长查询。
此外,索引/字符串字段上的选择总是比较慢。如果你可以做一个查找表的文件夹
即
id ----- folder
1 inbox
2 sent
3 trash
在poruke_konverzacija表转换from_folder和for_folder等效ID
SELECT *
FROM poruke_konverzacija
WHERE
for_id =2
AND for_folder = "inbox"
AND deleted !=2
UNION
SELECT *
FROM poruke_konverzacija
WHERE
from_id =2
AND from_folder = "inbox"
AND deleted!=2
答
从EXPLAIN输出,它看起来像mysql没有使用任何密钥。这是因为你在两个不同的领域使用OR。如果条件使用相同的字段,mysql将使用OR索引,例如。 field1 = v1或field1 = v2。如果您在条件中使用不同的字段,则不会使用索引请参阅:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html。
与UNION试试:
SELECT *
FROM poruke_konverzacija
WHERE for_id =2
AND for_folder = "inbox"
AND deleted !=2
UNION
SELECT *
FROM poruke_konverzacija
WHERE from_id =2
AND from_folder = "inbox"
AND deleted !=2