Sqlパフォーマンスの最適化--Explainコマンドに続くUSE INDEX

1293 ワード

Sqlパフォーマンスの最適化–Explainコマンドに続くUSE INDEX
最近、チャネルIDフィールドで検索するとき、チャネルIDにインデックスを付けたが、検索結果を得るには13秒ほどかかることが分かった.
id(プライマリキー)
チャネルID(チャネルID、インデックス列)
createTime(作成時間、インデックス列)
ああ、私のSQLはこうです.
SELECT id,channelid,createTime FROM order WHERE channelId=’1’ ORDER BY createTime DESC LIMIT 20
既存のデータベースサーバの構成で、このデータ量はそれほど遅くないと思いますので、Explainコマンドで分析してみました.結果は下図のようです.
id
table
Type
Possibole_keys
key
Extra
1
Order
Index
channelId
createTime
Using where
MysqlはクエリのインデックスとしてcreateTimeを使用しているが、予想とは異なり、理由を分析すると、Mysqlは条件よりもソート列インデックスの優先度が高いとデフォルトで考えられているのか、createTimeフィールドの値自体が分散しているため、Mysqlはクエリインデックスとして先にこの列を使用している.
このシーンから、実際にはどのデータベースのクエリー・アナライザも万能ではないことがわかります.アルゴリズムで最適化されており、最適なフィルタリング方法を見つけようとしていますが、すべての状況で役に立つわけではありません.プログラマーは弁証的な考え方を持って見なければなりません.問題が発生した場合、データベースが必ず最善の選択をすると盲目的に信じるのではなく、真剣に分析する必要があります.インデックスの目的は検索範囲を素早く絞ることですが、このSQLでは作成時間はソートのみで、インデックスを作るには範囲を素早く絞ることはできませんが、チャネルidでインデックスを作ると迅速に範囲を絞ることができるので、USE INDEX(channelId)メソッドでインデックスを指定してみましたが、やはり検索速度は20倍の向上(従来の13.45秒から0.58秒に向上)があり、SQLの性能最適化は確かに果てしなく、永遠に向上の余地がある.
USE INDEXコマンドを追加したSQLを添付します.
SELECT id,channelid,createTime FROM order USE INDEX(channelId) WHERE channelId=’1’ ORDER BY createTime DESC LIMIT 20