MySQL クエリ実行時間の最適化
大規模なデータベースを操作する場合、クエリの実行時間は重要な要素になります。そのようなシナリオの 1 つでは、100 万件のレコードを含む Web サイトのデータベースで、クエリの実行時間が過度に長くなりました。以下に示す 1 つのサンプル クエリは、この問題を示しています。
select * from `ratings` order by id limit 499500, 500
MySQL テーブルで 100 万レコードを処理しても問題は発生しないはずであると信じられていたにもかかわらず、このクエリの実行には一貫して 1 分以上かかりました。 id 列にインデックスを追加しても、この問題は軽減されませんでした。
しかし、このクエリの EXPLAIN プランを調査したところ、クエリがフル テーブル スキャン アプローチを使用していることが判明しました:
explain select * from `ratings` order by id limit 499500, 500; +----+-------------+---------+------+---------------+------+---------+------+---------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------+---------+------+---------+----------------+ | 1 | SIMPLE | ratings | ALL | NULL | NULL | NULL | NULL | 4718592 | Using filesort | +----+-------------+---------+------+---------------+------+---------+------+---------+----------------+
この問題に対処するには、where 句を利用して検索条件を絞り込むことが提案されました。 where 句が追加されると、クエリ プランが変更されました。
explain select * from `ratings` where id>=499501 limit 500; +----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+ | 1 | SIMPLE | ratings | range | PRIMARY | PRIMARY | 4 | NULL | 4198581 | Using index condition | +----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+
この変更により、クエリにインデックス条件アプローチが使用されるようになり、実行時間が大幅に短縮されました。
さらに、次の可能性があります。クエリ実行プロセスでデッドロックが発生する可能性は排除できません。デッドロックを診断するには、SHOW INNODB STATUS コマンドが役立つ場合があります。
以上が大規模なデータセットの MySQL クエリ実行時間を最適化するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。