我有一个拥有超过400万条记录的数据库,我想选择当前月份的记录而不进行全表扫描。
我在数据库上创建了日期索引,但是性能仍然很慢
SELECT sum(scores) as total
FROM customers
WHERE YEAR(date_created) = YEAR(CURDATE())
AND MONTH(cam_date) = MONTH(CURDATE());
该代码有效,但加载需要时间
答案 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