如何在两列中为IN使用创建索引

时间:2018-03-12 16:45:30

标签: mysql indexing

我需要优化一个表(它是INNODB),我将在两列中使用IN进行查询。

这是查询:

SELECT `emails`.* FROM `emails` 
  WHERE (`from` IN ('some@email.com', 'other@email.com') OR `to` IN ('some@email.com', 'other@email.com'))

fromto字段为VARCHAR(255)

如何创建索引以帮助加快速度。或者,如果我应该更改我的查询策略,请告诉我

我不确定是否应该为每列创建一个索引,或者为两列创建一个索引。我也不确定IN子句是否会使索引起作用。

2 个答案:

答案 0 :(得分:1)

问题1 - 创建

的索引

只需为每列创建一个索引。 之后,mysql可以将每个索引的结果合并到一个集合中。 关于这个问题的More

问题2 - 在条款

创建索引后,您可以通过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`)