2008-09-24 40 views
10

如果我有一个查询一样,是否索引< or > MySQL查询?

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

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

(建议更好地执行这个查询,而无需重新创建表,也将是确定!)

回答

11

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

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

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

或许,这应该是一个额外的问题,但有一个简单的答案(或参照MySQL文档的一部分),说明优化器是如何做出决定关于范围太大?特定情况在WHERE中没有别的。 – 2008-09-24 09:36:31

1

它,请与一个DESCRIBE SELECT FROM表...

2

索引在日期时间字段肯定会帮助基于日期范围的搜索。我们一直在我们的数据库中使用它们,并且查询速度很慢,没有索引。

4

MySQL Reference manual

A B树索引可以在使用表达式中使用列比较的=,>,> =,<,< =,或BETWEEN运算符。

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