- 问题:执行一个左关联查询,速度非常慢,有四五分钟,起初以为没加索引,检查后发现索引都是加好的,于是查看sql执行计划,如下:
EXPLAIN SELECT * FROM p_t_nc_relation a LEFT JOIN ms_region b ON a.source_id = b.ID WHERE b.ID IS NULL
结果如图:
图片.png
通过sql执行计划可以看到扫描的是全表。
后来找到了问题,查询速度慢是因为关联查询的字段类型不一致导致的
p_t_nc_relation 中的source_id 是bigint型的,ms_region 中的id 是varchar型的,所以导致索引失效了。
2.解决方法:
查询的时候将bigint型的转为varchar型
sql如下:
EXPLAIN SELECT * FROM p_t_nc_relation a LEFT JOIN ms_region b ON CAST(a.source_id AS CHAR) = b.ID WHERE b.ID IS NULL
更改sql后的结果如图:
图片.png
现在能看到索引已经起到作用了,查询速度飞快
其实基于这种已经加上索引,但是查询速度还很慢的问题,也可以从数据库编码,表编码,字段编码方向去考虑解决,有时候编码不一致也会导致这种问题。
关于编码问题导致的索引失效,链接:https://blog.csdn.net/everda/article/details/77476716
网友评论