MySQL, SQL, チューニング

SQL インデックスが効かない検索

 

基本戦略

テーブルを正規化する

JOIN(INNER JOIN)を有効に活用する

  • 非正規化でテーブルを巨大にしない
  • すべてのテーブルを正規化することは出来ない
    出来るテーブルのみ正規化する
  • EXPLAINで計測する、INDEXが有効に動いているか確認する

 

インデックスのデメリット

  • SELECT性能がBtreeインデックスによって向上するが、UPDATEでINDEXが再生成されるので遅くなります。

 

インデックスが効かない検索

 

  • 万単位のレコード、10~5%程度の該当率でないとINDEXは効かない
  • カーディナリティ(一意性)が十分でないとINDEXは効かない
  • テストによる大量のINSERTやUPDATEなどで統計情報が現実に即していないと効かない
    この場合は統計情報をリセットする

 

LIKE

INDEXが効く!

  • 完全一致
    INDEXが効いて高速検索が可能

    SELECT id FROM staff WHERE staff_name LIKE '金広優'
  • 前方一致
    INDEXが動作し高速に検索できる場合がある

    SELECT id FROM staff WHERE staff_name LIKE '金広%'

 

INDEXが効かない

  • 中間一致
    SELECT id FROM staff WHERE staff_name LIKE '%金広%'
  • 後方一致
    SELECT id FROM staff WHERE staff_name LIKE '%優'

 

 

IN

INDEXが効かない

  • サブクエリに置き換えよう

 

OR

INDEXが効かない

  • WHRE キー IN (数値, 数値)に置き換える

 

色々なINDEXが効かない

 

 

インデックスに演算を行っている

SELECT id FROM product WHERE price * 10 > 3000

 

 

インデックスに関数処理を行っている

  • REPLACE()
  • MAX()
    など
SELECT id FROM product WHERE MAX(PRICE) = 100

 

 

インデックスにIS NULLを行っている

SELECT id FROM product WHERE PRICE IS NULL

 

 

インデックスに否定形が使われている

SELECT id FROM product WHERE PRICE) <> 100

 
 

[amazon_link asins=’4798124702,B01HD5VWWO,4297107171,4798110663′ template=’ProductCarousel’ store=’izayoi55-22′ marketplace=’JP’ link_id=’f376cfd8-77cb-4acb-a964-b592b50256cc’]

 
 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)