分析&回答
字符串类型的索引
id_1 varchar(20) NOT NULL
这样下面两条语句的结果是一样的:
SELECT * FROM ix_test WHERE id_1=1;
SELECT * FROM ix_test WHERE id_1='1';
执行计划是不同的:
mysql> explain select * from ix_test where id_1=1;
| 1 | SIMPLE | ix_test | index | PRIMARY | PRIMARY | 302 | NULL | 11 | Using where; Using index |
mysql> explain select * from ix_test where id_1='1';
| 1 | SIMPLE | ix_test | const | PRIMARY | PRIMARY | 302 | const | 1 | Using index |
数字类型的索引
id_1 int(20) NOT NULL
SELECT * FROM ix_test WHERE id_1=1;
SELECT * FROM ix_test WHERE id_1='1';
执行结果和执行计划都是一样的。
结论
mysql sql优化器,对于where后面字段类型为字符串的数字,如果用数字去匹配(就是不用引号引上数字),则不能由索引直接命中,需要全部扫描。
反思&扩展
注意多表关联最容易出现上面问题
SELECT
ri.order_rec_id
FROM
hqew_order_goods og LEFT JOIN hqew_remove_list ri
ON ri.order_rec_id = CONCAT( og.rec_id, '' ) AND real_removal_numbers > 8888
WHERE
og.order_id = '888888' AND og.removal_numbers > 0
ri.order_rec_id og.rec_id 类型不一样 CONCAT 就非常关键了
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!