sqlにインデックスを強制する


sqltヒント(SQL HINT)はデータベースを最適化する重要な手段であり、sqlにいくつかのヒントを追加することで最適化の効果を果たす.
ここではuse index、ignore index、force indexについて学びます.
1クエリー文の後にuse indexを追加し、Mysqlに参照可能なインデックスを提案することで、mysqlが他のインデックスを考慮しないようにすることができます.
explain select count(*) from vipshop_finance_account ;

explain select count(*) from vipshop_finance_account use INDEX(idx_user_id) ;
explain select count(*) from vipshop_finance_account ;

SIMPLE  vipshop_finance_account index       idx_open_wpb_status 2       12816   Using index

explain select count(*) from vipshop_finance_account use INDEX(idx_user_id) ;

SIMPLE  vipshop_finance_account index       idx_user_id 152     12816   Using index

sqlが推奨を受け入れ、推奨インデックスを使用していることがわかります.
2 mysqlで1つ以上のインデックスを無視する場合はignore indexを使用します.
explain select count(*) from vipshop_finance_account IGNORE INDEX( idx_open_wpb_status);

SIMPLE  vipshop_finance_account index       idx_withhold_wpb_status 2       12816   Using index

このときmysqlは再び私たちの提案を受け入れ、インデックスidx_を無視したことがわかります.open_wpb_status、idx_を使用withhold_wpb_statusというインデックス.
3 force index
EXPLAIN SELECT * from vipshop_trade_log where related_tradeId>'004201509151046563846447';
EXPLAIN SELECT * from vipshop_trade_log USE INDEX (idx_related_tradeid) where related_tradeId>'004201509151046563846447';
EXPLAIN EXTENDED SELECT * from vipshop_trade_log FORCE INDEX (idx_related_tradeid) where related_tradeId>'004201509151046563846447';

実行結果
SIMPLE  vipshop_trade_log   ALL idx_related_tradeid             2068592 Using where
SIMPLE  vipshop_trade_log   ALL idx_related_tradeid             2068592 Using where
SIMPLE  vipshop_trade_log   range   idx_related_tradeid idx_related_tradeid 767     1034296 100 Using where

ここで3番目のsqlはidx_を使用して提案されていますrelated_tradeidはクエリーのインデックスとして、検索の行数を減らします.2番目のsql文はインデックスを使用していません.私たちの提案はいつもMysqlに受け入れられているわけではありません.