インデックス使用による InnoDB の COUNT(*) パフォーマンスの最適化
大規模な InnoDB テーブルを処理する場合、COUNT() クエリを実行する重大なパフォーマンス上の課題を引き起こす可能性があります。この問題は、提供されているサンプル テーブルで明らかになります。単純な COUNT() 呼び出しが完了するまでに 6 秒以上かかります。
インデックス使用量の悪用
によるとMySQL のドキュメントによると、インデックスを利用することで COUNT() のパフォーマンスを向上させることができます。 InnoDB にインデックスの使用を明示的に強制することで、COUNT() が通常実行する非効率なフル テーブル スキャンをバイパスするように効果的に指示できます。
ただし、クエリで USE INDEX (PRIMARY) ヒントを使用しているにもかかわらず、 、ステートメントの実行時間は改善されないままです。これは、最適化戦略が普遍的に効果的ではない可能性があることを示しています。
代替解決策: イベント スケジューラ
COUNT(*) のパフォーマンスを最適化する別のアプローチは、イベント スケジューラを使用することです。 。 MySQL 5.1.6 で導入されたこの機能を使用すると、カウント値を含む統計テーブルの更新など、定期的に実行するタスクをスケジュールできます。
ソリューションを実装する手順:
カウントを保存する統計テーブルを作成します:
<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>
イベント スケジューラ ソリューションの利点:
結論
ただし、USE INDEX ヒントが常に望ましいパフォーマンスをもたらすとは限りません。改善により、イベント スケジューラは、InnoDB で COUNT() のパフォーマンスを最適化するための実行可能な代替手段を提供します。別の統計テーブルを定期的に更新することで、直接 COUNT() クエリに関連するオーバーヘッドを効果的に回避できます。
以上がUSE INDEX (PRIMARY) が失敗した場合に InnoDB で COUNT(*) クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。