【问题标题】:Does an index < or > MySQL queries?是否索引 < 或 > MySQL 查询?
【发布时间】:2010-09-12 16:12:01
【问题描述】:

如果我有类似的查询,

DELETE FROM table WHERE datetime_field < '2008-01-01 00:00:00'

datetime_field 列索引有帮助吗?即索引仅在使用相等(或不等)测试时有用,还是在进行有序比较时也有用?

(建议更好地执行此查询,无需重新创建表,也可以!)

【问题讨论】:

    标签: mysql optimization indexing


    【解决方案1】:

    也许吧。一般来说,如果有这样的索引,如果查询上没有“更好”的索引,它将对该索引使用范围扫描。但是,如果优化器决定范围最终会太大(即包含超过 1/3 的行),它可能根本不会使用索引,因为表扫描可能会更快。

    使用 EXPLAIN(在 SELECT 上;您不能 EXPLAIN 删除)来确定它在特定情况下的决定。这可能取决于

    • 表中有多少行
    • 您指定的范围是多少
    • WHERE 子句中还指定了什么。如果有另一个“看起来更好”的索引,它将不会使用一个索引的范围扫描。

    【讨论】:

    • 也许这应该是一个额外的问题,但是是否有一个简单的答案(或参考 MySQL 文档的一部分)来解释优化器如何做出关于范围太大的决定?具体案例在 WHERE 中没有其他内容。
    【解决方案2】:

    来自MySQL Reference manual

    B 树索引可用于使用 =、>、>=、

    对于大量行,通过树索引查找行比通过表扫描查找行要快得多。但正如其他答案所指出的,请使用EXPLAIN 找出 MySQL 的决定。

    【讨论】:

      【解决方案3】:

      日期时间字段上的索引肯定有助于基于日期范围的搜索。我们一直在数据库中使用它们,如果没有索引,查询速度非常慢。

      【讨论】:

        【解决方案4】:

        确实如此,请使用 DESCRIBE SELECT FROM 表检查...

        【讨论】:

          【解决方案5】:

          除非你在mysql中没有这个bughttp://bugs.mysql.com/bug.php?id=58190

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-13
            • 1970-01-01
            • 2019-12-06
            • 2012-02-01
            • 1970-01-01
            • 2017-03-18
            相关资源
            最近更新 更多