Mysql
MySQL 是否使用其索引元數據來優化 COUNT(*) 查詢?
讓我們考慮一個
user_actions
帶有標準索引主鍵的表user_action_id
。我想知道直到某個鍵(比如 1 億)的使用者操作數:
SELECT COUNT(*) AS `user_actions_count` FROM `user_actions` WHERE `user_action_id` < 100000000
據我了解,索引 b-tree 必須保持每個樹節點的子節點計數以達到平衡目的。該資訊是否會用於執行如此明顯的查詢,或者引擎是否必須掃描整個索引才能實際計算行數?
事實上,我在該查詢中遇到了意想不到的性能問題。
謝謝你的幫助。
編輯:
這是查詢的解釋:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE user_actions range PRIMARY PRIMARY 4 NULL 268537554 Using where; Using index
它必須掃描整個索引。查看以下輸出:
SHOW INDEX FROM user_actions;
您將看到每個索引的大致基數。該近似值是基於對索引的一些隨機潛水,而不是經過詳盡檢查的確切數字。近似值足以平衡。
查詢需要根據 transaction_isolation_mode 檢查它是否可以“看到”每一行。所以,沒有你建議的捷徑。