簡體   English   中英

在沒有全表掃描的情況下選擇當月的記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM