歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 10萬以上數據查詢-存儲過程實現

10萬以上數據查詢-存儲過程實現

日期:2017/2/28 15:50:17   编辑:Linux教程
需求:有如下兩張表,其中tb_web_app表中數據有十萬甚至百萬,另,tb_web_app表中的c_category_code關聯表tb_system_category中的c_code字段。
  1. CREATE TABLE `tb_system_category` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `c_parent_id` int(11) NOT NULL,
  4. `c_name` varchar(50) NOT NULL,
  5. `c_full_name` varchar(200) DEFAULT NULL,
  6. `c_code` varchar(50) NOT NULL,
  7. `c_describe` text,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8;
  10. CREATE TABLE `tb_web_app` (
  11. `id` int(11) NOT NULL AUTO_INCREMENT,
  12. `c_name` varchar(255) NOT NULL,
  13. `c_package_name` varchar(255) NOT NULL,
  14. `c_category_code` varchar(50) NOT NULL DEFAULT '0',
  15. PRIMARY KEY (`id`)
  16. ) ENGINE=InnoDB AUTO_INCREMENT=138583 DEFAULT CHARSET=utf8;

要求分頁查詢tb_web_app表,並顯示其c_category_code對應的c_full_name(來自tb_system_category)。

筆者先是使用sql聯表語句進行查詢,不外乎left join等語句的使用,結果發現執行速度巨慢無比,遂轉成存儲過程實現,存儲過程代碼如下所示:

  1. CREATE PROCEDURE findWebappAndCategory(IN cName VARCHAR(255), IN pName VARCHAR(255), IN cCategoryCodes VARCHAR(100), IN cID INTEGER, IN cType VARCHAR(50), IN startRow INTEGER, IN pageSize INTEGER)
  2. BEGIN
  3. DECLARE cRand VARCHAR(50) DEFAULT RAND();
  4. -- 創建臨時表
  5. CREATE TEMPORARY TABLE IF NOT EXISTS tb_system_temp_wac(
  6. id INTEGER,
  7. c_name varchar(255),
  8. c_package_name varchar(255),
  9. c_category_code varchar(50),
  10. categoryName VARCHAR(255),
  11. cRand VARCHAR(50)
  12. );
  13. -- 按條件找到webapp
  14. CALL findWebapp(cName,pName,cCategoryCodes,cID,cType,startRow,pageSize,cRand);
  15. -- 將找到的webapp的c_category_code的值進行替換
  16. CALL generateCategoryName(cRand);
  17. -- 返回結果
  18. SET @mySql = CONCAT('select * from tb_system_temp_wac where cRand=\'',cRand,'\'');
  19. PREPARE stmt FROM @mySql;
  20. EXECUTE stmt;
  21. END
Copyright © Linux教程網 All Rights Reserved