这两天处理一个现网的MySQL慢查询工单,学到了一个好用的MySQL函数:cast。事情是这样的:
我们有两张表 t_user 和 t_rule 表,需要关联这两张表去查询,关联字段是 t_user 表的主键id,int型,和t_rule表的 v0字段,varchar(32)。
下面是未走索引的sql样例和explain:
可以看到由于没有进行类型转换,该条sql会先查询t_user表,然后再通过t_user表的主键id去连接 t_rule表,但由于关联字段类型不一样,所以没有走索引, 最终查询 t_rule表是 全表扫描。
下面我们看下优化后的sql样例和explain:
优化该sql主要有两点:
(1)加了个联合索引 idx_ptype_v01
(v0
,ptype
,v1
)
(2)使用了cast函数对 t_user 表的id进行了类型转换,转换成了和v0字段一样的varchar类型,才能够走到索引。
总结,以上就是这个cast函数的使用方式之一,当然,解决这个慢sql还有很多方法,比如不连表查询,或者将v0字段改成int型等方法(这个方法慎用,因为对于强类型语言而言,数据库字段从varchar类型改为int型,意味着代码也要改)。
参考链接:
cast函数讲解:https://blog.csdn.net/qq_21101587/article/details/78642423
MySQL中隐式转换导致索引失效:https://www.cnblogs.com/guitu18/p/12113495.html