2010-01-29 47 views
0

这是表结构: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,查询非常慢。有没有其他的方式来获得相同的结果?

回答

3

索引也被删除。还有......联盟可能会更好,运行两个并发查询而不是一个长查询。

此外,索引/字符串字段上的选择总是比较慢。如果你可以做一个查找表的文件夹

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 
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