2012-11-05 148 views
1

我在mysql中有这个查询,我想索引,什么是最好的索引组成?索引mysql查询

SELECT cometchat.id, cometchat.from, cometchat.to, cometchat.message, cometchat.sent, cometchat.read, cometchat.direction 
FROM cometchat 
WHERE (
(
cometchat.to = '30411' 
AND cometchat.direction <>2 
) 
OR (
cometchat.from = '30411' 
AND cometchat.direction <>1 
) 
) 

我已经试过这些指标,但他们没有工作:

ALTER TABLE `cometchat` ADD INDEX ( `from`,`to`,`direction`) 
ALTER TABLE `cometchat` ADD INDEX ( `from`,`to`) 
ALTER TABLE `cometchat` ADD INDEX ( `to`,`direction`) 
ALTER TABLE `cometchat` ADD INDEX ( `from`,`direction`) 

任何帮助将非常感激。

+0

该查询的解释计划是什么? – doublesharp

回答

0

只尝试使用以下:

ALTER TABLE `cometchat` ADD INDEX (`direction`) 
1

因为你的where子句中,你需要2个独立的索引optimaze选择在OR的:

ALTER TABLE `cometchat` ADD INDEX index1 ( `to`,`direction`) 
ALTER TABLE `cometchat` ADD INDEX index2 ( `from`,`direction`) 

我就懒得努力做出这些覆盖索引 - 只需要花费点查找的成本。但是,如果你希望他们能够覆盖你需要:

ALTER TABLE `cometchat` ADD INDEX index1 
      (`to`,`direction`, `message`, `sent`, `read`); 
    ALTER TABLE `cometchat` ADD INDEX index2 
      ( `from`,`direction`,`message`, `sent`, `read`); 

的覆盖索引会给最好的选择性能,但它是一个很多额外的存储,并且将添加到插入的开销 - 所以我只如果未覆盖的表现不够,则使用它们,这是插入光表。

此外,只是一些一般性的建议,我会避免在命名数据库,表或列时使用MySQL保留字,如'from'。 https://dev.mysql.com/doc/refman/5.5/en/reserved-words.html
当您使用保留名称作为某个名称时,您确实需要运行一个错误的查询,这将导致另一个SP问题;)