51Testing软件测试论坛

标题: 关于mysql存储过程执行时间长,求优化思路? [打印本页]

作者: 测试积点老人    时间: 2020-6-4 15:02
标题: 关于mysql存储过程执行时间长,求优化思路?
关于mysql存储过程执行时间长,求优化思路?
现有一张包含经(lon)纬(lat)度的A (c_pc_stake_info)表,在另一张B表( b_pc_compaction_info)中也包含有经(lon)纬(lat)度字段,需要返回的数据是A表的经纬度、通过A表每两条数据的经纬度和B表的经纬度相比较,得到B表数据在A表这两条数据经纬度之间的个数

  1. <p>CREATE <a href="mailto:DEFINER=root@%PROCEDUREcompaction">DEFINER=root@%PROCEDUREcompaction</a>(
  2. out num INTEGER,
  3. out startLon DOUBLE,
  4. out startLat DOUBLE,
  5. out startStakeNum varchar(100),
  6. out endLon DOUBLE,
  7. out endLat DOUBLE,
  8. out endStakeNum varchar(100)
  9. )
  10. BEGIN
  11. -- 定义变量
  12. DECLARE s int DEFAULT 0;
  13. DECLARE stakeId INTEGER;
  14. DECLARE lons DOUBLE;
  15. DECLARE lats DOUBLE;
  16. DECLARE stakeNum VARCHAR(50);
  17. DECLARE compaction_lon DOUBLE;
  18. DECLARE compaction_lat DOUBLE;
  19. -- 临时表
  20. -- 封装最后所得数据
  21. create temporary table if not exists stake_info_vo (
  22. number INTEGER,
  23. startLon DOUBLE,
  24. startLat DOUBLE,
  25. startStakeNum VARCHAR(50),
  26. endLon DOUBLE,
  27. endLat DOUBLE,
  28. endStakeNum VARCHAR(50)
  29. );
  30. -- 经B表筛选过的数据插入此表
  31. create temporary table if not exists lon_lat (</p><p>lon1 DOUBLE,
  32. lat1 DOUBLE
  33. );
  34. BEGIN
  35. -- B表筛选后的数据
  36. declare lonLat CURSOR for
  37. SELECT
  38. lon,
  39. lat
  40. from b_pc_compaction_info
  41. where 1=1
  42. and SUBSTRING_INDEX(create_time," ",1) = SUBSTRING_INDEX((select max(create_time) from b_pc_compaction_info)," ",1)
  43. -- ;
  44. and LENGTH(SUBSTRING_INDEX(lon,".",-1)) = 8
  45. and LENGTH(SUBSTRING_INDEX(lat,".",-1)) = 8;
  46. -- insert into lon_lat VALUES (compaction_lon,compaction_lat);
  47. DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
  48. open lonLat;
  49. fetch lonLat into compaction_lon,compaction_lat;
  50. set s = 0;
  51. while(s=0) do
  52. insert into lon_lat VALUES (compaction_lon,compaction_lat);
  53. fetch lonLat into compaction_lon,compaction_lat;
  54. end while;
  55. -- 关闭游标
  56. close lonLat;
  57. END;
  58. BEGIN
  59. -- 定义游标,并将sql结果集赋值到游标中
  60. DECLARE report CURSOR FOR
  61.      -- 查询A表数据
  62. select
  63. id,lon,lat,stake_num
  64. from c_pc_stake_info
  65. ORDER BY id;
  66. -- 声明当游标遍历完后将标志变量置成某个值
  67. DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;</p><p>-- 打开游标
  68. open report;</p><p>
  69.    -- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
  70.    fetch report into stakeId,lons,lats,stakeNum;
  71.            set s=0;</p><p>   -- 当s不等于1,也就是未遍历完时,会一直循环
  72.    while (s<>1) do</p><p>       -- 通过遍历获取A表的第二条数据
  73.      SELECT
  74.       lon,
  75.       lat,
  76.      stake_num
  77.       into endLon,endLat,endStakeNum
  78.    FROM c_pc_stake_info
  79.    WHERE id = (SELECT MIN(id) FROM c_pc_stake_info WHERE id > stakeId);</p><p>           -- 获取B表数据在A表每两条数据经纬度之间的个数
  80.                     SELECT count(1) into num
  81.                     from lon_lat
  82.                     where 1=1
  83.                 and lon1 between lons and endLon
  84.                     and lat1 between lats and endLat
  85.                ;</p><p>
  86.            SET startLon  = lons;
  87.     set startLat  = lats;      
  88.     set startStakeNum  = stakeNum;
  89.             -- set num = 1;
  90.     INSERT INTO stake_info_vo VALUES (num,startLon,startLat,startStakeNum,endlon,endlat,endStakeNum);  </p><p>       -- 当s等于1时表明遍历以完成,退出循环
  91.        fetch report into stakeId,lons,lats,stakeNum;
  92.    end while;
  93. -- 关闭游标
  94. close report;
  95.    SELECT * from stake_info_vo;
  96.    -- SELECT * from lon_lat;
  97. end;
  98. truncate TABLE stake_info_vo;
  99. truncate TABLE lon_lat;
  100. END</p>
复制代码




作者: bellas    时间: 2020-6-5 09:54
如果不改设计的话,应该就是排序算法的选择问题了。 如果改设计的话,需要的是获取区间的个数,那就尽量让他查到即得到结果。那可以每条数据变化时更新他所属区间这条数据所包含的个数;或者是延时更新,即每5分钟后台统计一次,每次查询获取的是上一个5分钟统计的结果
作者: 郭小贱    时间: 2020-6-5 09:58
可以参考这篇文章:https://developer.aliyun.com/ask/289654?scm=20140722.184.2.173
作者: qqq911    时间: 2020-6-5 10:42
从sql开始优化
作者: 海海豚    时间: 2020-6-5 11:03
https://developer.aliyun.com/ask/289654?scm=20140722.184.2.173  参考下
作者: jingzizx    时间: 2020-6-5 13:00
一个点一个点的进行优化




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2