我在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`)
任何帮助都将不胜感激。
由于您的where子句中的 OR
,您需要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保留的单词,例如"从"命名数据库,表格或列时。https://dev.mysql.com/doc/refman/5.5/en/resverd-words.html
当您使用预留的名称作为您真正要求遇到的越野虫查询的名称时,这将导致另一个SP问题;)
尝试仅使用以下内容:
ALTER TABLE `cometchat` ADD INDEX (`direction`)