51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1911|回复: 5
打印 上一主题 下一主题

关于mysql存储过程执行时间长,求优化思路?

[复制链接]
  • TA的每日心情
    擦汗
    前天 09:07
  • 签到天数: 527 天

    连续签到: 4 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2020-6-4 15:02:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点
    关于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>
    复制代码



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-30 15:02
  • 签到天数: 751 天

    连续签到: 2 天

    [LV.10]测试总司令

    2#
    发表于 2020-6-5 09:54:39 | 只看该作者
    如果不改设计的话,应该就是排序算法的选择问题了。 如果改设计的话,需要的是获取区间的个数,那就尽量让他查到即得到结果。那可以每条数据变化时更新他所属区间这条数据所包含的个数;或者是延时更新,即每5分钟后台统计一次,每次查询获取的是上一个5分钟统计的结果
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-10-22 14:23
  • 签到天数: 1007 天

    连续签到: 1 天

    [LV.10]测试总司令

    3#
    发表于 2020-6-5 09:58:29 | 只看该作者
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 10:10
  • 签到天数: 1516 天

    连续签到: 5 天

    [LV.Master]测试大本营

    4#
    发表于 2020-6-5 10:42:46 | 只看该作者
    从sql开始优化
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:59
  • 签到天数: 1801 天

    连续签到: 5 天

    [LV.Master]测试大本营

    5#
    发表于 2020-6-5 11:03:01 | 只看该作者
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 07:28
  • 签到天数: 2812 天

    连续签到: 5 天

    [LV.Master]测试大本营

    6#
    发表于 2020-6-5 13:00:47 | 只看该作者
    一个点一个点的进行优化
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-17 07:21 , Processed in 0.066913 second(s), 21 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表