【问题标题】:Does MySql DBMS change queries to use index before they execute it?MySql DBMS 是否在执行查询之前更改查询以使用索引?
【发布时间】:2021-11-12 06:54:10
【问题描述】:

当我使用 '!=' 或 '' 进行查询时,我知道 DBMS 不使用索引。

select * from test where test_id != 1234

所以像底部一样查询,使用索引可以得到相同的结果。

select * from test where test_id < 1234 or test_id > 1234

但是当我看到解释计划时都使用范围(范围扫描)。 所以我很好奇,如果我使用 '!=' 进行查询,MySql DBMS 是否会将查询更改为 '> 和

【问题讨论】:

  • 查询选择了大部分行——在这种情况下索引使用无效,优先使用表扫描。
  • 有很多因素会影响索引的使用。你不会得到一个人为的简单案例的答案,这将在实际情况下对你有所帮助。如果你有一个你关心的真实案例,请询问。
  • test_id &lt; 1234 and test_id &gt; 1234 总是错误的!你到底是什么意思?也许OR 而不是AND?
  • Opps...它的 OR...

标签: mysql indexing


【解决方案1】:

!=(又名&lt;&gt;)通常表示“我想要除一个之外的所有行”。因此,在该列上建立索引本质上是无用的;扫描表更快,跳过那一行。

WHERE test_id < 1234 OR test_id > 1234 

等价于

WHERE test_id != 1234

但OR 通常不能使用任何索引。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多