电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL 使用自定義變量進(jìn)行查詢優(yōu)化

瀏覽:4日期:2023-10-03 08:58:26
目錄優(yōu)化排序查詢避免重復(fù)獲取剛剛修改的數(shù)據(jù)行懶加載的聯(lián)合查詢優(yōu)化排序查詢

自定義變量的一個(gè)重要特性是你可以同時(shí)將該變量的數(shù)學(xué)計(jì)算后的結(jié)果再賦值給該變量,類似于我們的 i = i + 1這種方式。下面是一個(gè)用于計(jì)算數(shù)據(jù)表行號(hào)的例子:

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

actor_id rownum 1 1 2 2 3 3

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

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

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

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

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

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;

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

避免重復(fù)獲取剛剛修改的數(shù)據(jù)行

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

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

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

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

雖然還是有一個(gè)查詢操作,但是后面的查詢操作不再需要訪問數(shù)據(jù)庫了。

懶加載的聯(lián)合查詢

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

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

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

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;

上述的查詢?nèi)绻谝恍杏薪Y(jié)果,則@found 不會(huì)被賦值,因而是 NULL,從而執(zhí)行第二次查詢。而第三次的 UNION 實(shí)際沒什么效果,只是為了將@found恢復(fù)到 NULL 值,以便這段 SQL 可以重復(fù)執(zhí)行。另一個(gè)驗(yàn)證的方法是對(duì)同一張表進(jìn)行這樣的操作,可以發(fā)現(xiàn)實(shí)際只會(huì)返回一行數(shù)據(jù)或不返回?cái)?shù)據(jù)(查詢不到數(shù)據(jù)時(shí))。

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 使用自定義變量進(jìn)行查詢優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于MySQL 用自定義變量進(jìn)行查詢優(yōu)化的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 双菱电缆-广州电缆厂_广州电缆厂有限公司| 自动化改造_智虎机器人_灌装机_贴标机-上海圣起包装机械 | 钢结构厂房造价_钢结构厂房预算_轻钢结构厂房_山东三维钢结构公司 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 深圳标识制作公司-标识标牌厂家-深圳广告标识制作-玟璟广告-深圳市玟璟广告有限公司 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 2025第九届世界无人机大会| 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 千淘酒店差旅平台-中国第一家针对TMC行业的酒店资源供应平台 | 走心机厂家,数控走心机-台州博城智能科技有限公司 | 水热合成反应釜-防爆高压消解罐-西安常仪仪器设备有限公司 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | 土壤养分检测仪|土壤水分|土壤紧实度测定仪|土壤墒情监测系统-土壤仪器网 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | 天津拓展_天津团建_天津趣味运动会_天津活动策划公司-天津华天拓展培训中心 | 361°官方网站| 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 广州番禺搬家公司_天河黄埔搬家公司_企业工厂搬迁_日式搬家_广州搬家公司_厚道搬迁搬家公司 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 |