百萬數據使用子查詢進行SQL優化

操作: 查詢條件放到子查詢中,子查詢只查主鍵ID,然後使用子查詢中確定的主鍵關聯查詢其他的屬性字段。

原理: 減少回表操作。

適用場景:使用limit分頁查詢

-- 優化前SQL
SELECT  各種字段
FROM `table_name`
WHERE 各種條件
LIMIT 0,10;
-- 優化後SQL
SELECT  各種字段
FROM `table_name` main_tale
RIGHT JOIN
(
SELECT  子查詢只查主鍵
FROM `table_name`
WHERE 各種條件
LIMIT 0,10
) temp_table ON temp_table.主鍵 = main_table.主鍵

準備工作: 

爲了體現效果,我創建了一張test_user表,有主鍵,年齡,姓名字段。可以按我的代碼創建一個函數往數據庫表裏灌入100萬數據:

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_initData`()
begin
    declare n int default 1;
    declare MAX int default 1000000;
    while n <= MAX do
        insert into test_user(age,user_name) values (floor(10+rand()*(99-10+1)),CONCAT(SUBSTRING('趙錢孫李周吳鄭王馮陳諸衛蔣沈韓楊朱秦尤許何呂施張孔曹嚴華金魏陶姜戚謝鄒喻柏水竇章雲蘇潘葛奚範彭郎魯韋昌馬苗鳳花方俞任袁柳酆鮑史唐費廉岑薛雷賀倪湯滕殷羅畢郝鄔安常樂於時傅皮齊康伍餘元卜顧孟平黃和穆蕭尹姚邵堪汪祁毛禹狄米貝明臧計伏成戴談宋茅龐熊紀舒屈項祝董粱杜阮藍閔席季麻強賈路婁危江童顏郭梅盛林刁鍾徐邱駱高夏蔡田樊胡凌霍虞萬支柯咎管盧莫經房裘幹解應宗丁宣賁鄧鬱單杭洪包諸左石崔吉鈕龔',FLOOR(1+190*RAND()),1),SUBSTRING('明國華建文平志偉東海強曉生光林小民永傑軍金健一忠洪江福祥中正振勇耀春大寧亮宇興寶少劍雲學仁濤瑞飛鵬安亞澤世漢達衛利勝敏羣波成榮新峯剛家龍德慶斌輝良玉俊立浩天宏子鬆克清長嘉紅山賢陽樂鋒智青躍元武廣思雄錦威啓昌銘維義宗英凱鴻森超堅旭政傳康繼翔棟仲權奇禮楠煒友年震鑫雷兵萬星駿倫紹麟雨行才希彥兆貴源有景升惠臣慧開章潤高佳虎根遠力進泉茂毅富博霖順信凡豪樹和恩向道川彬柏磊敬書鳴芳培全炳基冠暉京欣廷哲保秋君勁軒帆若連勳祖錫吉崇鈞田石奕發洲彪鋼運伯滿庭申湘皓承梓雪孟其潮冰懷魯裕翰徵謙航士堯標潔城壽楓革純風化逸騰嶽銀鶴琳顯煥來心鳳睿勤延凌昊西羽百捷定琦聖佩麒虹如靖日詠會久昕黎桂瑋燕可越彤雁孝憲萌穎藝夏桐月瑜沛誠夫聲冬奎揚雙坤鎮楚水鐵喜之迪泰方同濱邦先聰朝善非恆晉汝丹爲晨乃秀巖辰洋然厚燦卓楊鈺蘭怡靈淇美琪亦晶舒菁真涵爽雅愛依靜棋宜男蔚芝菲露娜珊雯淑曼萍珠詩璇琴素梅玲蕾豔紫珍麗儀夢倩伊茜妍碧芬兒嵐婷菊妮媛蓮娟一',FLOOR(1+400*RAND()),1),SUBSTRING('明國華建文平志偉東海強曉生光林小民永傑軍金健一忠洪江福祥中正振勇耀春大寧亮宇興寶少劍雲學仁濤瑞飛鵬安亞澤世漢達衛利勝敏羣波成榮新峯剛家龍德慶斌輝良玉俊立浩天宏子鬆克清長嘉紅山賢陽樂鋒智青躍元武廣思雄錦威啓昌銘維義宗英凱鴻森超堅旭政傳康繼翔棟仲權奇禮楠煒友年震鑫雷兵萬星駿倫紹麟雨行才希彥兆貴源有景升惠臣慧開章潤高佳虎根遠力進泉茂毅富博霖順信凡豪樹和恩向道川彬柏磊敬書鳴芳培全炳基冠暉京欣廷哲保秋君勁軒帆若連勳祖錫吉崇鈞田石奕發洲彪鋼運伯滿庭申湘皓承梓雪孟其潮冰懷魯裕翰徵謙航士堯標潔城壽楓革純風化逸騰嶽銀鶴琳顯煥來心鳳睿勤延凌昊西羽百捷定琦聖佩麒虹如靖日詠會久昕黎桂瑋燕可越彤雁孝憲萌穎藝夏桐月瑜沛誠夫聲冬奎揚雙坤鎮楚水鐵喜之迪泰方同濱邦先聰朝善非恆晉汝丹爲晨乃秀巖辰洋然厚燦卓楊鈺蘭怡靈淇美琪亦晶舒菁真涵爽雅愛依靜棋宜男蔚芝菲露娜珊雯淑曼萍珠詩璇琴素梅玲蕾豔紫珍麗儀夢倩伊茜妍碧芬兒嵐婷菊妮媛蓮娟一',FLOOR(1+400*RAND()),1)));
				set n=n+1;
    end while;
end

先看看還沒優化的:

SELECT * FROM test_user WHERE age>50 LIMIT 100000,10;

執行時間爲:0.086S

接下來看看優化之後的:

SELECT *
FROM test_user t0
RIGHT JOIN
(
SELECT user_id
FROM test_user
WHERE age>50 LIMIT 100000,10
) t1 ON t1.user_id = t0.user_id;

執行時間爲:0.071S

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章