加速MySQL 中的行計數以獲得Swift 結果
對大型MySQL 表中的行進行計數可能是一項耗時的任務。當表包含數百萬行時尤其如此。標準 SELECT COUNT(*) 查詢可能需要幾秒鐘才能完成,這可能是嚴重的效能瓶頸。
為什麼索引可能沒有幫助
將索引新增至索引列通常可以提高查詢的效能。然而,在計算行數的情況下,索引可能不會提供顯著的好處。這是因為查詢仍然需要掃描表中的每一行以確定行數。
替代技術
除了快取或更新摘要資訊之外,還有加速行計數查詢的技術有限。一種可能的解決方案是使用基於列的儲存引擎,例如 Apache Parquet。基於列的引擎專為分析查詢而設計,對於某些類型的查詢(包括行計數)可以更快。但是,基於列的引擎可能不適合所有用例,並且對於其他查詢類型可能有缺點。
基於觸發器的總表
最有效的方法加快行計數查詢的方法是維護一個總表。此匯總表可以儲存索引列的每個可能值的行計數。當插入、刪除或更新行時,觸發器可以相應地更新匯總表。無論表的大小如何,這種方法都可以提供近乎瞬時的行計數查詢。
以下是基於觸發器的匯總表的範例:
CREATE TABLE books_cnt ( status VARCHAR(255) NOT NULL, total INT NOT NULL ); CREATE TRIGGER ai_books AFTER INSERT ON books FOR EACH ROW UPDATE books_cnt SET total = total + 1 WHERE status = NEW.status; CREATE TRIGGER ad_books AFTER DELETE ON books FOR EACH ROW UPDATE books_cnt SET total = total - 1 WHERE status = OLD.status; CREATE TRIGGER au_books AFTER UPDATE ON books FOR EACH ROW BEGIN IF (OLD.status <> NEW.status) THEN UPDATE books_cnt SET total = total + IF(status = NEW.status, 1, -1) WHERE status IN (OLD.status, NEW.status); END IF; END;
透過使用此觸發器基於總計表,您可以透過簡單的查詢來擷取每個狀態值的行數:
SELECT status, total FROM books_cnt;
此查詢將立即傳回結果,即使對於大桌子。
以上是如何加快 MySQL 中的行計數以提高效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!