我需要优化一个表(它是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
子句是否会使索引起作用。
答案 0 :(得分:1)
只需为每列创建一个索引。 之后,mysql可以将每个索引的结果合并到一个集合中。 关于这个问题的More
创建索引后,您可以通过explain
自行查看。它应该工作。如果由于某种原因您的mysql版本没有使用IN
查询的索引,您可以使用OR
重写原始查询,因为您的查询等同于
`from` = 'some@email.com' OR `from` = 'other@email.com' OR `to` = 'some@email.com' OR `to` = 'other@email.com'
答案 1 :(得分:0)
如果"索引合并"没有踢,#34;转入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`)