Mysql 使用OR运算符时更正索引

Mysql 使用OR运算符时更正索引,mysql,indexing,where-clause,Mysql,Indexing,Where Clause,我有这样一个问题: SELECT fields FROM table WHERE field1='something' OR field2='something' OR field3='something' OR field4='something' 为这个查询索引这样一个表的正确方法是什么 像这样的查询需要整整一秒钟才能运行!我有一个索引,其中包含所有4个字段,所以我认为mysql会这样做: SELECT fields FROM table WHERE field1='something'

我有这样一个问题:

SELECT fields FROM table
WHERE field1='something' OR field2='something' 
OR field3='something' OR field4='something'
为这个查询索引这样一个表的正确方法是什么

像这样的查询需要整整一秒钟才能运行!我有一个索引,其中包含所有4个字段,所以我认为mysql会这样做:

SELECT fields FROM table
WHERE field1='something' OR field2='something' 
OR field3='something' OR field4='something'
浏览索引中的每一行,思考以下内容:
field1是什么?第二场怎么样?第三场?第四场?好的,不,转到下一行。

您误解了索引的工作方式

想象一本电话簿(相当于一本关于姓氏的两列索引,姓氏)。如果我让你在电话簿上找到所有姓“史密斯”的人,你可以从这样排列姓名的事实中获益;你可以假设史密斯一家是被组织在一起的。但是,如果我让你找到所有的名字是“约翰”的人,你从索引中得不到任何好处。约翰可以有任何姓氏,所以他们分散在整本书中,你最终不得不从封面到封面进行艰难的搜索

现在,如果我让你找到所有姓“史密斯”或姓“约翰”的人,你可以像以前一样轻松找到史密斯一家,但这对你找到约翰一家毫无帮助。它们仍然散落在整本书中,你必须努力寻找它们

SQL中的多列索引也是如此。索引按第一列进行排序,如果第一列中有ties,则按第二列进行排序,如果前两列中都有ties,则按第三列进行排序,以此类推。它不会同时按所有列进行排序。因此,除了索引中最左边的列外,多列索引无助于提高搜索词的效率

回到你原来的问题

为这个查询索引这样一个表的正确方法是什么

在每列上创建单独的单列索引。其中一个索引将是比其他索引更好的选择,基于MySQL的特性,如果使用该索引,将产生问题

MySQL的现代版本也有一些智能,因此查询可能会在给定表中使用多个索引,然后尝试合并结果。否则,MySQL往往被限制在给定查询中每个表使用一个索引

许多人成功使用的另一个技巧是对每个索引列(应该使用各自的索引)执行单独的查询,然后
UNION
结果

SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 
最后一个观察:如果您发现自己在四个字段中搜索相同的
'something'
,那么您应该重新考虑这四个字段是否实际上都是相同的东西,并且您设计了一个这样的表。如果是这样,那么字段1到字段4可能属于子表中的一列。这样索引和查询就变得容易多了:

SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'

除先前的评论外: 如果优化器认为索引合并是个好主意,一些RDM(如Mysql/PostgreSql)可以使用索引合并。 因此,您可以为每个字段创建不同的索引,或者创建一些复合索引,如field1、field2和field3、field4。最后,您应该尝试几种不同的解决方案,并选择最佳解释方案