Mysql

MySQL 是否使用其索引元數據來優化 COUNT(*) 查詢?

  • October 20, 2020

讓我們考慮一個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 檢查它是否可以“看到”每一行。所以,沒有你建議的捷徑。

引用自:https://dba.stackexchange.com/questions/278083