【问题标题】:How to select mySQL records based only on month and year without full table scan如何仅基于月份和年份选择mySQL记录而不进行全表扫描
【发布时间】:2020-05-22 06:07:12
【问题描述】:

我需要根据月份和年份选择记录,月份和年份将来自PHP

所以我有这样的查询

SELECT id, created FROM table_name WHERE YEAR(created) = 2020 AND MONTH(created) = 05 LIMIT 500;

这里创建的是日期时间字段,这个查询的问题是,如果表的记录较少,它工作正常,但是当表记录增加时,查询变得很慢

我的表中有 2020-05 年的 10,000 多条记录,总共有 100 万条记录,因此执行此查询大约需要 11 秒,我怀疑这是因为查询正在执行全表扫描

帮我提供一个解决方案,让这个查询执行得更快?

【问题讨论】:

  • created 列是否已编入索引?

标签: php mysql sql codeigniter query-optimization


【解决方案1】:

在 where 子句中使用函数时,您在 where 子句中使用 YEAR() 和 MONTH() 函数 MySQL 不使用该列的索引来执行查询。

您可以将您的查询更改为下面并尝试一下

SELECT id, created FROM table_name WHERE created between '2020-05-01 00:00:00' and '2020-05-31 23:59:59'

** 不要忘记为您的字段添加索引。

【讨论】:

  • 我更喜欢这种模式:WHERE created >= '2020-05-01' AND created < '2020-05-01' + INTERVAL 1 MONTH——避免了几个潜在的错误,比如闰年。
猜你喜欢
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多