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接纳。