就优化而言,在mysql中DATETIME索引列上的SELECT查询中使用DATE是否正确?

马赫什格

我有一张非常大的桌子(425+百万行)。

CREATE TABLE `DummyTab` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(48) NOT NULL,
  `BeginDate` datetime DEFAULT NULL,
  `EndDate` datetime NOT NULL,
  ......
  ......
  KEY `BeginDate_index` (`dBegDate`),
  KEY `id` (`id`),
) ENGINE=MyISAM

选择是根据“ BeginDate”和此表上的其他条件完成的

select * from DummyTab where Name like "%dummyname%" and BeginDate>= 20141101

现在,在这种情况下,仅提供datetime过期的日期字段(尽管它将用作2014-11-01 00:00:00)。

问题是,即使在这种情况下仅提供日期,优化器是否也会正确使用DATETIME索引?还是应该在“日期”字段上设置索引以更有效地使用而不是“日期时间”

斯图尔特

是的,BeginDate_index当使用仅DATE过滤器指定查询时仍可以使用该查询(也对施加其他条件Name也不会取消索引的资格)。

如果查看此SqlFiddle随机数据,并Execution plan在底部展开,则会看到类似以下内容的内容:

ID   SELECT_TYPE  TABLE  TYPE     POSSIBLE_KEYS    KEY             KEY_LEN   REF    ROWS   FILTERED                EXTRA
1    SIMPLE       DummyTab range  BeginDate_index  BeginDate_index 6         17190  100    Using index condition;  Using where   

(具体KEYBeginDate_index)。但是请注意,不能保证使用索引,例如,如果您针对更广泛的日期条件执行相同的查询,则可能会使用不同的计划(例如,如果您对使用相同的小提琴> 20140101BeginDate_index则不再使用它,因为它没有提供足够的选择性)。

编辑,回复:关于精确性的注释
由于BeginDate是日期时间,因此文字20141101也会被转换为日期时间(一次)。文档

如果参数之一是TIMESTAMP或DATETIME列,而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳。

再次,是的,根据您的最后一段,过滤器中的文字BeginDate >= 20141101将转换为确切的日期时间201411010000002014-11-01 00:00:00),并将考虑任何符合条件的索引(但同样,永远不能保证)。

不能使用索引的一个常见问题是,因为过滤器谓词不可保留,是因为将函数应用于过滤器中的列,因为引擎将需要对查询中所有其余行求值。这里有一些例子

因此,稍微修改一下示例,以下查询会执行相同的操作,但是第二个查询要慢得多。该查询是可查询的:

SELECT * FROM DummyTab
WHERE BeginDate < 20140101;  -- Good

而这不是:

SELECT * FROM DummyTab
WHERE YEAR(BeginDate) < 2014; -- Bad

在这里更新了SqlFiddle-再次查看Execution Plans底部的,以了解不同之处。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

优化我的SQL查询-选择正确的索引

来自分类Dev

MySQL索引用法查询优化

来自分类Dev

MySQL 100%CPU +慢查询-无法正确使用索引

来自分类Dev

使用“ NOT IN”优化MySQL查询

来自分类Dev

MySQL优化使查询NOT IN复杂化(在2 SELECT WITH JOIN中)

来自分类Dev

如何使用多列索引优化MySQL查询?

来自分类Dev

优化慢速索引的MySql查询

来自分类Dev

检查索引是否在SQL查询中使用?

来自分类Dev

如何在PostgreSQL中的外表SELECT MAX(id)查询中使用索引?

来自分类Dev

MYSQL-索引和优化选择查询

来自分类Dev

是否可以使用查询select及其索引来选择数组中的元素?

来自分类Dev

在SELECT中优化子查询

来自分类Dev

是否在查询中使用部分索引?

来自分类Dev

MySQL在SELECT子查询中使用变量

来自分类Dev

优化MySQL表索引/查询

来自分类Dev

如何使用主查询中的LEFT JOIN和子查询中的INNER JOIN优化MySQL SELECT查询?

来自分类Dev

MySQL 100%CPU +慢查询-未正确使用索引

来自分类Dev

MySQL:索引未在单个查询或联接查询中使用

来自分类Dev

如果在查询中使用索引列的子集,是否保留索引的MySQL查询性能优势?

来自分类Dev

就优化而言,在mysql中DATETIME索引列上的SELECT查询中使用DATE是否正确?

来自分类Dev

优化慢速索引的MySql查询

来自分类Dev

如何在MySQL中使用'in'子句优化select的删除?

来自分类Dev

检查索引是否在SQL查询中使用?

来自分类Dev

优化使用IN和MAX(date)的MySQL查询

来自分类Dev

使用索引优化MySQL查询性能

来自分类Dev

是否优化 select max(date) sql 查询?

来自分类Dev

我在子查询 MySQL 的 Where 子句中使用 NOT IN 和 IF 是否正确?

来自分类Dev

我们是否需要在 MySQL 中的给定列上使用多个索引?

来自分类Dev

查询中未使用 PostgreSql jsonb 列上的 GIN 索引

Related 相关文章

  1. 1

    优化我的SQL查询-选择正确的索引

  2. 2

    MySQL索引用法查询优化

  3. 3

    MySQL 100%CPU +慢查询-无法正确使用索引

  4. 4

    使用“ NOT IN”优化MySQL查询

  5. 5

    MySQL优化使查询NOT IN复杂化(在2 SELECT WITH JOIN中)

  6. 6

    如何使用多列索引优化MySQL查询?

  7. 7

    优化慢速索引的MySql查询

  8. 8

    检查索引是否在SQL查询中使用?

  9. 9

    如何在PostgreSQL中的外表SELECT MAX(id)查询中使用索引?

  10. 10

    MYSQL-索引和优化选择查询

  11. 11

    是否可以使用查询select及其索引来选择数组中的元素?

  12. 12

    在SELECT中优化子查询

  13. 13

    是否在查询中使用部分索引?

  14. 14

    MySQL在SELECT子查询中使用变量

  15. 15

    优化MySQL表索引/查询

  16. 16

    如何使用主查询中的LEFT JOIN和子查询中的INNER JOIN优化MySQL SELECT查询?

  17. 17

    MySQL 100%CPU +慢查询-未正确使用索引

  18. 18

    MySQL:索引未在单个查询或联接查询中使用

  19. 19

    如果在查询中使用索引列的子集,是否保留索引的MySQL查询性能优势?

  20. 20

    就优化而言,在mysql中DATETIME索引列上的SELECT查询中使用DATE是否正确?

  21. 21

    优化慢速索引的MySql查询

  22. 22

    如何在MySQL中使用'in'子句优化select的删除?

  23. 23

    检查索引是否在SQL查询中使用?

  24. 24

    优化使用IN和MAX(date)的MySQL查询

  25. 25

    使用索引优化MySQL查询性能

  26. 26

    是否优化 select max(date) sql 查询?

  27. 27

    我在子查询 MySQL 的 Where 子句中使用 NOT IN 和 IF 是否正确?

  28. 28

    我们是否需要在 MySQL 中的给定列上使用多个索引?

  29. 29

    查询中未使用 PostgreSql jsonb 列上的 GIN 索引

热门标签

归档