我有一張包含數百萬條記錄的表。我想獲取當前日期的前 10 名收入者(通過分組 user_id 并添加publisher_earn同一用戶的欄位值來計算),我為此創建了以下查詢。
SELECT user_id, SUM(publisher_earn) AS publisher_earnings
FROM statistics
WHERE created LIKE "2022-03-15%"
GROUP BY user_id
ORDER BY publisher_earnings DESC
limit 10
該查詢給出了預期的結果,但問題是它需要大約 90 秒來完成處理。
上述查詢中是否可以進行任何修改,以使其在 10-15 秒或更短的時間內更快地獲得結果?
表架構:
CREATE TABLE `statistics` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL DEFAULT 0,
`publisher_earn` decimal(50,9) NOT NULL DEFAULT 0.000000000,
`user_agent` text DEFAULT NULL,
`created` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_userid` (`user_id`),
KEY `idx_created_userid` (`created`,`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=41685 DEFAULT CHARSET=utf8
注意:我sum在 SQL 查詢中使用,因為單個用戶有多個條目,我想在publisher_earn欄位上應用添加。
uj5u.com熱心網友回復:
WHERE created LIKE "2022-03-15%"
-->
WHERE created >= "2022-03-15"
AND created < "2022-03-15" INTERVAL 1 DAY
前者不是“sargable”,因為它必須將 aDATETIME轉換為字串才能執行LIKE. 后者可能idx_created_userid非常有效地使用索引。
uj5u.com熱心網友回復:
上述查詢中是否可以進行任何修改,以使其在 10-15 秒或更短的時間內更快地獲得結果?
不,您無法在查詢中更改任何內容來彌補表上缺少索引的情況。每次您運行該查詢時,MySQL 都必須查看表中的每一行,您所說的大約有 8,000,000 行。索引使得 MySQL 只需要查看相關行的一小部分。
uj5u.com熱心網友回復:
我能夠通過使用以下查詢來解決這個問題。
select user_id, SUM(publisher_earn) as earning from statistics
WHERE created between "2022-03-14 00:00:00" and "2022-03-14 23:59:59"
GROUP BY user_id
order by earning desc
limit 10
它會立即回傳結果(少于 1 秒)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/444080.html
