我需要优化一个表(它是INNODB(,我将在其中使用两列中的IN
进行查询。
这是查询:
SELECT `emails`.* FROM `emails`
WHERE (`from` IN ('some@email.com', 'other@email.com') OR `to` IN ('some@email.com', 'other@email.com'))
from
和to
字段VARCHAR(255)
如何创建索引以帮助加快速度。或者,如果我应该更改我的查询策略,请告诉我
我不确定是应该为每列创建一个索引,还是应该为两列创建一个索引。我也不确定IN
子句是否会使索引起作用。
问题 1 - 要创建哪个索引
只需为每列创建一个索引。之后,mysql 将能够将每个索引的结果合并为一个集合。有关该主题的更多信息
问题 2 - 在条款中
创建索引后,您可以通过explain
自行查看。它应该有效。如果由于某种原因您的 mysql 版本不使用索引进行IN
查询,您可以使用 OR
重写原始查询,因为您的查询等效于
`from` = 'some@email.com' OR `from` = 'other@email.com' OR `to` = 'some@email.com' OR `to` = 'other@email.com'
如果"索引合并"没有启动,"将OR转换为UNION":
SELECT *
FROM `emails`
WHERE `from` IN ('some@email.com', 'other@email.com')
UNION
SELECT *
FROM `emails`
WHERE `from``to` IN ('some@email.com', 'other@email.com')
并有
INDEX(`from`),
INDEX(`to`)