【问题标题】:Placing index columns on the left of a mysql WHERE statement?将索引列放在 mysql WHERE 语句的左侧?
【发布时间】:2009-09-09 13:17:25
【问题描述】:

我很好奇,因为我在文档中读到了它。会写吗

select * from CONTACTS where id = ‘098’ and name like ‘Tom%’;

加快查询速度,而不是

select * from CONTACTS where name like ‘Tom%’ and id = ‘098’;

第一个在左侧有一个索引列。它实际上是加快速度还是迷信?

使用php和mysql

【问题讨论】:

  • 正如其他人所说,MySQL 不关心顺序。但我记得在 Oracle 上(很久以前,也许它不再是问题了)必须使用 where 子句的顺序才能让它使用正确的索引。我当然不会错过那些日子......

标签: sql mysql micro-optimization


【解决方案1】:

使用explain 检查查询计划。它们应该完全相同。

【讨论】:

    【解决方案2】:

    这纯粹是迷信。我看不出任何一个查询的速度会有所不同。但是,如果它是 OR 查询而不是 AND 查询,那么我可以看到将它放在左侧可能会加快速度。

    【讨论】:

      【解决方案3】:

      有趣的问题,我试过一次。查询计划相同(使用EXPLAIN)。

      但考虑到短路评估,我也想知道为什么没有区别(或者 mysql 是否完全评估布尔语句?)

      【讨论】:

        【解决方案4】:

        可能记错或误读其他内容,关于通配符位于 Like 谓词中的字符串文字的哪一侧。将通配符放在右侧(如 yr 示例中),允许查询引擎使用您正在搜索的表列上可能存在的任何索引(在本例中为名称)。但是如果你把通配符放在左边,

        select * from CONTACTS where name like ‘%Tom’ and id = ‘098’;
        

        那么引擎不能使用任何现有的索引并且必须进行完整的表扫描。

        【讨论】:

          猜你喜欢
          • 2021-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-07
          相关资源
          最近更新 更多