在没有全表扫描的情况下选择当月的记录

时间:2019-06-05 09:57:04

标签: php mysql

我有一个拥有超过400万条记录的数据库,我想选择当前月份的记录而不进行全表扫描。

我在数据库上创建了日期索引,但是性能仍然很慢

SELECT sum(scores) as total
FROM customers 
WHERE YEAR(date_created) = YEAR(CURDATE())
      AND MONTH(cam_date) = MONTH(CURDATE());

该代码有效,但加载需要时间

4 个答案:

答案 0 :(得分:0)

您可以使用:

CopyOnWriteArrayList<T>

答案 1 :(得分:0)

您可以尝试将日期分为三列-年,月和日期。搜索整数会更快,然后搜索日期,但是将所有400万条记录更改为该方案可能需要一些时间。

答案 2 :(得分:0)

在没有2019年6月8日要求的其他信息的情况下,请尝试使用此技术,

SET @my_bom=CURDATE();
SET @my_now=NOW();
SELECT date_add(@my_bom,interval -DAY(@my_bom)+1 DAY) INTO @my_bom;
SELECT sum(scores) AS total
FROM customers 
WHERE date_created BETWEEN @my_bom AND @my_now;

想法是从该种子网址中获取的, https://blog.sqlauthority.com/2014/04/09/mysql-finding-first-day-and-last-day-of-a-month/

此技术将避免现有查询的不确定性,因此在处理中应使用索引。要通过EXPLAIN进行验证。

查看配置文件,实用程序脚本下载的网络配置文件,可在需要增强性能时免费使用。

答案 3 :(得分:0)

谢谢大家的贡献,这就是我解决的方式:

我在数据库上运行了此查询以创建索引,

CREATE INDEX date_index ON customers(date_created);

然后我使用此代码选择总和

SELECT sum(scores) as total FROM customers WHERE date_created>= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH AND date_created< LAST_DAY(CURDATE()) + INTERVAL 1 DAY