1

我在 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`)

任何帮助将非常感激。

4

2 回答 2

1

由于OR在 where 子句中,您需要 2 个单独的索引来优化选择:

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问题 ;)

于 2012-11-05T15:26:56.033 回答
0

尝试仅使用以下内容:

ALTER TABLE  `cometchat` ADD INDEX (`direction`)
于 2012-11-05T15:26:13.330 回答