强制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忽略一个或者多个索引,可以使用 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

可见,这里第三个sql,我们的建议被采纳,使用了idx_related_tradeid作为查询的索引,减少了搜索的行数。第二个sql语句没有使用索引,说明我们的建议并不是总被Mysql接纳。

你可能感兴趣的:(learn,on,work)