日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL 使用自定義變量進行查詢優化

瀏覽:27日期:2023-10-03 08:58:26
目錄優化排序查詢避免重復獲取剛剛修改的數據行懶加載的聯合查詢優化排序查詢

自定義變量的一個重要特性是你可以同時將該變量的數學計算后的結果再賦值給該變量,類似于我們的 i = i + 1這種方式。下面是一個用于計算數據表行號的例子:

SET @rownum := 0;SELECT actor_id, @rownum := @rownum + 1 AS rownumFROM sakila.actor LIMIT 3;

actor_id rownum 1 1 2 2 3 3

得到的結果也許看起來沒什么意義,這是因為主鍵是從1自增的,因此行號和主鍵值是一樣的。但是,這種方式可以用于做排序。例如需要查詢飾演電影數量最多的前10名演員,通常的做法是像下面這樣寫:

SELECT actor_id, COUNT(*) as cntFROM sakila.film_actorGROUP BY actor_idORDER BY cnt DESCLIMIT 10;

得到的結果也許看起來沒什么意義,這是因為主鍵是從1自增的,因此行號和主鍵值是一樣的。但是,這種方式可以用于做排序。例如需要查詢飾演電影數量最多的前10名演員,通常的做法是像下面這樣寫:

SELECT actor_id, COUNT(*) as cntFROM sakila.film_actorGROUP BY actor_idORDER BY cnt DESCLIMIT 10;

如果我們要獲得相應的排名值的話,則可以引入變量來完成:

SET @curr_cnt := 0, @prev_cnt := 0, @rank := 0;SELECT actor_id,@curr_cnt := cnt AS cnt, @rank := IF(@prev_cnt <> @curr_cnt, @rank+1, @rank) as rank, @prev_cnt:= @curr_cnt AS dummyFROM ( SELECT actor_id, COUNT(*) AS cnt FROM sakila.film_actorGROUP BY actor_idORDER BY cnt DESCLIMIT 10) as der;

這里是將飾演電影的數量賦值給了 curr_cnt 變量,使用了prev_cnt 存儲前一個演員的參演數量。排名從第一名開始的,如果后面的演員的數量和前一個演員的數量不同,則排名要往下(+1),如果相同則和前一個演員的排名相同。通過這種方式可以直接從查詢結果中得到演員的排名,而不需要再從數據庫查詢做二次處理(當然也可以通過程序代碼實現)。

避免重復獲取剛剛修改的數據行

如果想在更新數據行的時候再重新獲取數據行的信息,往往需要再讀取一次數據庫。這是因為 MySQL 不像 PostgreSQL 的 UPDATE RETURNING 功能可以同時返回更新后的數據行,而只是返回更新影響的行數。但是,我們可以通過自定義變量完成這樣的操作。例如,獲取剛剛被修改過更新時間的行,不使用自定義變量的話需要做一次額外的查詢:

UPDATE tb1 SET lastUpdated = NOW() WHERE id = 1;SELECT lastUpdated FROM tb1 WHERE id = 1;

而使用自定義變量的時候可以避免這種情況:

UPDATE tb1 SET lastUpdated = NOW() WHERE id = 1 AND @now := NOW();SELECT @now;

雖然還是有一個查詢操作,但是后面的查詢操作不再需要訪問數據庫了。

懶加載的聯合查詢

假設我們需要寫一個聯合查詢完成如下任務:在聯合的分支上查找匹配的數據行,如果找到了就跳過其他分支。y這種情況發生在需要從熱區數據或低頻訪問數據中查找(比如近期訂單和歷史訂單)。這是下面針對用戶查詢的一個普通的 SQL:

SELECT id FROM users WHERE id = 123UNION ALLSELECT id FROM users_archived WHERE id = 123;

這個查詢會先從當前正在使用的用戶表查詢 id 為123的用戶,然后 在從已歸檔的用戶表找同樣 id 的用戶。但是,這種寫法比較低效,即便是在 users 表找到了想要找的用戶,還是需要從users_archived 這個表再找一次,而實際用戶 id 為123的只會存在其中的一張表中或兩張表的數據是一樣的。通過懶加載的聯合查詢,可以避免這種情況——只有在第一個分支沒有找到數據時才進行第二個分支的查詢。因此可以使用 MySQL 的 GREATEST 方法來作為查詢結果的容器以避免多返回數據列。

SELECT GREATEST(@found := -1, id) AS id, users.name, ’users’ as which_tb1FROM users WHERE id = 123UNION ALLSELECT id, users_archived.name, ’users_archived’ FROM users_archived WHERE id = 123 AND @found IS NULLUNION ALLSELECT 1, ’’, ’reset’ FROM DUAL WHERE ( @found := NULL) IS NOT NULL;

上述的查詢如果第一行有結果,則@found 不會被賦值,因而是 NULL,從而執行第二次查詢。而第三次的 UNION 實際沒什么效果,只是為了將@found恢復到 NULL 值,以便這段 SQL 可以重復執行。另一個驗證的方法是對同一張表進行這樣的操作,可以發現實際只會返回一行數據或不返回數據(查詢不到數據時)。

SELECT GREATEST(@found := -1, `id`) AS `id`, `infocenter_city`.`name`, ’city’ as which_tb1 FROM `infocenter_city` WHERE `id` = 460100 UNION ALL SELECT `id`, `infocenter_city`.`name`, ’infocenter_city’ FROM `infocenter_city` WHERE id = 460100 AND @found IS NULL UNION ALL SELECT 1, ’’, ’reset’ FROM DUAL WHERE ( @found := NULL) IS NOT NULL

以上就是MySQL 使用自定義變量進行查詢優化的詳細內容,更多關于MySQL 用自定義變量進行查詢優化的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区二区网站| 美女国产一区二区三区| 夜夜嗨一区二区三区| 国产麻豆一区二区三区| 欧美交a欧美精品喷水| 亚洲精品亚洲人成在线观看| 视频在线观看国产精品| 韩日一区二区| 日韩中文字幕区一区有砖一区| 国产精品国码视频| 国产精品第一| 亚洲我射av| 国产精品亚洲欧美一级在线| 日韩精品中文字幕吗一区二区| 亚洲日本国产| 日韩av自拍| 欧美精品国产| 视频一区视频二区中文字幕| 国产资源在线观看入口av| 国产精品久久亚洲不卡| 亚洲手机在线| 色婷婷色综合| 伊人久久一区| 久久精品免费一区二区三区| 99久久99久久精品国产片果冰| 国产v综合v| 久久av日韩| 国产精品婷婷| 欧美综合社区国产| 五月激情久久| 国产在线欧美| 国产精品久一| 99国产精品久久久久久久| 日韩一区二区三区在线看| 久久久精品国产**网站| 亚洲午夜一级| 免费一级欧美片在线观看网站 | 最新国产精品视频| 国产精品xxx| 狠狠爱www人成狠狠爱综合网| 亚洲最新av| 国产传媒在线| 日韩综合一区二区| 欧美日韩视频免费观看| 青青草国产精品亚洲专区无| 欧美精品91| 野花国产精品入口| 日韩av二区| 国产日韩在线观看视频| 亚洲一区二区免费看| 久久久久久夜| 国产探花在线精品一区二区| 久久电影一区| 99久久夜色精品国产亚洲1000部| 国产精品观看| 日日夜夜免费精品视频| 亚洲成人日韩| 裤袜国产欧美精品一区| 国产欧美日韩影院| 亚洲我射av| 女人av一区| 中文字幕人成乱码在线观看| 国产美女亚洲精品7777| 影音先锋久久精品| 国产午夜精品一区二区三区欧美 | 亚洲免费影院| 在线视频观看日韩| 亚洲天堂资源| 成人三级高清视频在线看| 国产乱码精品一区二区三区亚洲人| 激情综合网址| 999精品色在线播放| 精品国产鲁一鲁****| 日本免费在线视频不卡一不卡二| 日韩精品一卡二卡三卡四卡无卡| 欧美在线亚洲| 亚洲欧美日韩高清在线| 欧美福利在线| 欧美日韩少妇| 六月天综合网| 亚洲精品三级| 日韩精品三级| 日韩av网站免费在线| 日韩三级一区| 日本欧美大码aⅴ在线播放| 日欧美一区二区| 97se亚洲| 国产午夜久久av| 欧美午夜网站| 国产精品久av福利在线观看| 欧美a级一区二区| 久久亚洲精精品中文字幕| 久久av免费| 黑森林国产精品av| 久久蜜桃av| 久久久久国产精品一区三寸| 久久精品卡一| 免费看的黄色欧美网站| 亚洲一二av| 奇米狠狠一区二区三区| 国产精品99久久免费| 欧美激情三区| 精品一区二区三区在线观看视频| 成人在线视频中文字幕| 欧洲一区二区三区精品| 亚洲女同中文字幕| 亚洲一区二区日韩| 91精品国产自产精品男人的天堂| 国产伦理久久久久久妇女| 久久精品三级| 136国产福利精品导航网址| 日韩亚洲在线| 日韩av不卡在线观看| 国产精品毛片久久久| 电影91久久久| 国产一区观看| 亚洲精品伊人| 老牛国内精品亚洲成av人片 | 亚洲精品系列| 欧美黑人做爰爽爽爽| 亚洲h色精品| 亚洲一级大片| 精品欧美视频| 好看不卡的中文字幕| 日本aⅴ亚洲精品中文乱码| 精品国产成人| 国产精品美女久久久| 日韩av资源网| 亚洲精品永久免费视频| 91精品蜜臀一区二区三区在线 | 99热精品久久| 免费看精品久久片| 国产精品久久久久毛片大屁完整版| 91亚洲国产高清| 日韩专区欧美专区| 精品一区二区三区中文字幕视频 | 麻豆成人综合网| 九九久久电影| 蜜桃av一区二区| 精品99在线| 久久av在线| 国产福利91精品一区二区| 亚洲在线免费| 精品久久久久中文字幕小说| 香蕉精品999视频一区二区| 欧美经典一区| 免费不卡在线观看| 黑人精品一区| 日本少妇精品亚洲第一区| 免费一二一二在线视频| 综合欧美亚洲| 精品日韩视频| 国产精品久一| 亚洲欧美日韩国产综合精品二区 | 亚欧成人精品| 99久久夜色精品国产亚洲狼| 欧美亚洲免费| 天堂av在线一区| аⅴ资源天堂资源库在线| 日韩精品一区二区三区av | 欧洲一区二区三区精品| 国产午夜精品一区在线观看| 99热精品久久| 精品国产一区二区三区av片| 亚洲人成高清| 亚洲激情中文| 久久精品国内一区二区三区水蜜桃| 国产精品入口久久| 特黄毛片在线观看| 麻豆成人av在线| 日韩av电影一区| 中文一区一区三区免费在线观 | 天堂av在线| 国产欧美日韩一区二区三区在线| 丝袜美腿亚洲一区| 亚洲欧美伊人| 99精品电影| 97se综合| 国产suv精品一区| 欧美激情 亚洲a∨综合| 清纯唯美亚洲综合一区| 日韩精品一二三四| 欧美另类专区| 久久精品国产99久久| 精品久久久亚洲| 国产精品多人| 欧美激情91| 麻豆91精品91久久久的内涵| 国产亚洲久久| 国产无遮挡裸体免费久久| 亚洲精品国产精品粉嫩| 99视频一区| 亚洲少妇在线| 欧美日韩国产亚洲一区| 国产主播一区| 婷婷综合社区| 99在线精品免费视频九九视| 一区在线免费观看| 一区免费在线| 国产亚洲精品久久久久婷婷瑜伽|