最近查看之前数据库问题时发现当时出现并发过高,数据库查询出现瓶颈,导致登录响应过长。写了几个测试脚本定位问题,最后发现是因为同样的语句,直接调用和放在存储过程中调用的时间差距过大导致。
当时表格内容有30多W条记录,加了索引,按理说这点量不应该出现效率问题,最近我在自己电脑上模拟了一样的表格,里面放入100+W记录,执行一条select的时间,放在存储过程和直接调用时间如下:
单独执行如下图,时间几乎0ms
将语句放入存储过程中,时间慢的令人发指
定位到问题就好办,查阅了相关资料,好像有点类似sqlserver的参数嗅探,mysql没有特别说明,原理暂时没彻底搞明白,但是解决思路是有的,如果一定要使用存储过程来完成,将其改成参数绑定就能解决:
BEGIN
#Routine body goes here...
SET @UUID = in_uuid;
SET @stmt='SELECT id FROM t_reg WHERE imei = ?';
PREPARE stmt1 from @stmt;
EXECUTE stmt1 USING @UUID;
END
再次执行存储过程,时间和单独执行的耗时几乎一样: