mysql 統(tǒng)計(jì)近 30 萬條數(shù)據(jù)時(shí)間過長?
當(dāng)需要統(tǒng)計(jì)大量數(shù)據(jù)時(shí),例如這里提到的二十九萬條數(shù)據(jù),mysql 的執(zhí)行速度似乎令人擔(dān)憂,直接使用 count(*) 查詢需要 13 秒多。對(duì)于這種數(shù)量級(jí)的數(shù)據(jù),這個(gè)時(shí)間開銷是否正常呢?
可能的優(yōu)化方案
- 避免使用 count(*): count(*) 對(duì)整個(gè)表進(jìn)行全表掃描,對(duì)于大表來說代價(jià)比較高。建議將其替換為條件查詢或索引掃描。
- 維護(hù)統(tǒng)計(jì)數(shù)據(jù): 不要在每次查詢時(shí)都統(tǒng)計(jì),可以考慮通過觸發(fā)器或其他機(jī)制在數(shù)據(jù)更新時(shí)自動(dòng)維護(hù)統(tǒng)計(jì)數(shù)據(jù)。
- 利用觸發(fā)器: mysql 支持使用觸發(fā)器來在事件發(fā)生時(shí)自動(dòng)執(zhí)行任務(wù),可以在數(shù)據(jù)更新時(shí)自動(dòng)更新統(tǒng)計(jì)數(shù)據(jù),避免手動(dòng)維護(hù)。
具體實(shí)現(xiàn)
以下是一個(gè)使用觸發(fā)器維護(hù)統(tǒng)計(jì)數(shù)據(jù)的示例:
CREATE TRIGGER `trigger_t_order` AFTER INSERT ON `t_order_old` FOR EACH ROW BEGIN -- 更新統(tǒng)計(jì)數(shù)據(jù) UPDATE `t_order_stats` SET `count` = `count` + 1 WHERE `order_id` = NEW.`order_id`; END
登錄后復(fù)制
通過這樣的方法,可以使用戶在需要時(shí)快速獲取統(tǒng)計(jì)數(shù)據(jù),而無需每次都對(duì)大量數(shù)據(jù)進(jìn)行掃描。