迅速な結果を得るために MySQL での行カウントを高速化
大規模な MySQL テーブル内の行をカウントするのは、時間のかかる作業になる可能性があります。これは、テーブルに数百万の行が含まれている場合に特に当てはまります。標準の SELECT COUNT(*) クエリは完了するまでに数秒かかる場合があり、これが重大なパフォーマンスのボトルネックになる可能性があります。
インデックスが役に立たない理由
インデックスの追加多くの場合、インデックス付き列によりクエリのパフォーマンスが向上します。ただし、行をカウントする場合、インデックスは大きな利点をもたらさない可能性があります。これは、行数を決定するためにクエリがテーブル内のすべての行をスキャンする必要があるためです。
代替手法
概要情報のキャッシュや更新以外にも、次のような方法があります。行カウントクエリを高速化するための限定的な手法。考えられる解決策の 1 つは、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 中国語 Web サイトの他の関連記事を参照してください。