[英]How to select mySQL records based only on month and year without full table scan
[英]Select records from current month without full table scan
我有一個超過400萬條記錄的數據庫,我想選擇當前月份的記錄而不進行全表掃描。
我在數據庫上創建了日期索引,但是性能仍然很慢
SELECT sum(scores) as total
FROM customers
WHERE YEAR(date_created) = YEAR(CURDATE())
AND MONTH(cam_date) = MONTH(CURDATE());
該代碼有效,但需要花費一些時間來加載
您可以使用:
SELECT sum(scores) as total FROM customers WHERE date_created > DATE_SUB(NOW(), INTERVAL 1 MONTH) ORDER BY id DESC;
您可以嘗試將日期分為三列-年,月和日期。 搜索整數將更快,僅搜索日期,但是將所有400萬條記錄更改為該方案可能需要一些時間。
在沒有要求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;
從此種子URL https://blog.sqlauthority.com/2014/04/09/mysql-finding-first-day-and-last-day-of-a-month/
該技術將避免現有查詢的不確定性,並且在處理中應使用索引。 有待EXPLAIN驗證。
查看配置文件,實用程序腳本下載的網絡配置文件,可以在需要時免費使用以提高性能。
謝謝大家的貢獻,這就是我解決的方法:
我在數據庫上運行此查詢以創建索引,
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.