Php 如何只根据月份和年份选择mySQL记录,而不进行全表扫描
我需要根据月份和年份选择记录,月份和年份将来自PHP 所以我有这样的疑问Php 如何只根据月份和年份选择mySQL记录,而不进行全表扫描,php,mysql,sql,codeigniter,query-optimization,Php,Mysql,Sql,Codeigniter,Query Optimization,我需要根据月份和年份选择记录,月份和年份将来自PHP 所以我有这样的疑问 SELECT id, created FROM table_name WHERE YEAR(created) = 2020 AND MONTH(created) = 05 LIMIT 500; 这里创建的是datetime字段,这个查询的问题是,如果表的记录较少,它工作正常,但是当表记录增加时,查询变得非常慢 我在2020-05年的表中有10000多条记录,总共有100万条记录,因此执行此查询大约需要11秒,我怀疑这是因
SELECT id, created FROM table_name WHERE YEAR(created) = 2020 AND MONTH(created) = 05 LIMIT 500;
这里创建的是datetime字段,这个查询的问题是,如果表的记录较少,它工作正常,但是当表记录增加时,查询变得非常慢
我在2020-05年的表中有10000多条记录,总共有100万条记录,因此执行此查询大约需要11秒,我怀疑这是因为查询正在进行完整的表扫描
请帮助我找到一个解决方案,使此查询执行得更快?您在where子句中使用YEAR()和MONTH()函数,而在where子句中使用函数时,MySQL不使用该列的索引来执行查询
您可以将查询更改为下面的内容并进行尝试
SELECT id, created FROM table_name WHERE created between '2020-05-01 00:00:00' and '2020-05-31 23:59:59'
**别忘了给你的字段添加索引。创建的
列是否已被索引?我更喜欢这样的模式:创建的位置>='2020-05-01'和创建的<'2020-05-01'+间隔1个月
——避免了一些潜在的错误,例如闰年。