處理大而窄的 InnoDB 表時,執行 COUNT(*) 查詢可能會非常慢。這是在一個由約 900 萬筆記錄組成的表格導致 6 秒 COUNT(*) 操作的場景中遇到的。
根據 MySQL 文檔,強制 InnoDB 使用索引進行計數操作可以產生顯著的效能效益。這是透過在查詢中使用 USE INDEX (index_name) 語法來實現的。
在給定的範例中,使用了以下查詢:
<code class="sql">SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY);</code>
但是,儘管使用了索引,但表現仍然很糟糕。在尋求進一步的故障排除選項時,發現 MySQL 5.1.6 引入了一個涉及事件調度程序和統計快取的有效解決方案。
利用事件調度程序並維護stats 表中,COUNT(*) 操作可以顯著優化。這個過程需要建立一個統計表來儲存計數資料:
<code class="sql">CREATE TABLE stats (`key` VARCHAR(50) NOT NULL PRIMARY KEY, `value` VARCHAR(100) NOT NULL);</code>
隨後,建立一個事件來定期更新目前計數的統計表:
<code class="sql">CREATE EVENT update_stats ON SCHEDULE EVERY 5 MINUTE DO INSERT INTO stats (`key`, `value`) VALUES ('data_count', (SELECT COUNT(id) FROM data)) ON DUPLICATE KEY UPDATE value=VALUES(value);</code>
This self -包含的解決方案允許自訂刷新間隔,確保儲存計數的準確性和新鮮度。雖然它可能不完美,但與傳統方法相比,它提供了相當大的性能增強。
以上是如何使用索引和統計快取優化 InnoDB 上的 COUNT(*) 效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!