大きくても狭い 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 ではイベント スケジューラと統計キャッシュを含む効率的なソリューションが導入されていることがわかりました。
イベント スケジューラを利用し、統計テーブルを使用すると、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 中国語 Web サイトの他の関連記事を参照してください。