だから問題は
この種のクエリを高速化するためのテクニックはありますか?
まあ、そうではありません。列ベースのストレージエンジンは、これらのSELECT COUNT(*)クエリを使用するとおそらく高速になりますが、他のほとんどのクエリではパフォーマンスが低下します。
最善の策は、トリガーを介して要約テーブルを維持することです。オーバーヘッドはそれほど多くなく、テーブルがいくら大きくてもSELECT部分は瞬時に実行されます。ボイラープレートコードは次のとおりです。
DELIMITER //
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
//