もくじ
基本戦略
テーブルを正規化する
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’]