
提問:mysql 百萬級數據統計性能較差
問題描述:
使用以下 SQL 語句統計 29 萬條數據的表 t_order_old,執行時間長達 13.96 秒。詢問這樣的執行時間是否正常,以及是否存在進一步優化的可能。
解答:
count(*) 的性能開銷
使用 count(*) 統計大數據表時,性能往往比較低。這是因為:
- count(*) 會掃描整個表,導致 I/O 開銷較大。
- count(*) 不會利用索引,只能通過全表掃描逐行統計。
優化建議:
- 使用索引統計:針對需要統計的字段創建索引,然后使用 count(column) 代替 count(*),這樣可以利用索引加速統計。
- 維護統計表:建立一個包含統計數據的單獨表,定期更新表的數據以保持準確。這樣可以在需要時快速查詢統計信息,而無需對主表進行全表掃描。
- 使用觸發器維護統計數據:在主表上創建觸發器,在數據更新時自動更新統計表。這樣做可以確保統計信息始終是最新的,并避免全表掃描帶來的性能開銷。
- 使用 EXPLaiN 分析查詢:執行 EXPLAIN select count(*) FROM t_order_old“ 語句,可以了解查詢的執行計劃,并找出潛在的性能瓶頸。