国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

真實(shí)場(chǎng)景sql優(yōu)化持續(xù)更新(老司機(jī)必備)

這篇具有很好參考價(jià)值的文章主要介紹了真實(shí)場(chǎng)景sql優(yōu)化持續(xù)更新(老司機(jī)必備)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

概述

下述場(chǎng)景,均來(lái)自實(shí)際產(chǎn)品線(xiàn)上經(jīng)驗(yàn),出于保密考量,所有需求場(chǎng)景都是仿造的,模擬遇到過(guò)的真實(shí)場(chǎng)景。

場(chǎng)景一: 統(tǒng)計(jì)數(shù)據(jù)(Order by 不具備唯一性導(dǎo)致的分頁(yè)數(shù)據(jù)混亂)

需求

在實(shí)際業(yè)務(wù)場(chǎng)景中,我們經(jīng)常遇到統(tǒng)計(jì)分析,比如現(xiàn)在有一張學(xué)生表student,現(xiàn)統(tǒng)計(jì)姓名為xxx的總共有多少學(xué)生。

id name
1 張三
2 張三
3 李四
4 武器
5 大炮
6 大炮
7 李四
8 無(wú)用
9 劉可
10 狐貍
11 無(wú)話(huà)
12 敗給
13 事變
14 狐貍
15 何必
16 無(wú)話(huà)
17 無(wú)用
18 無(wú)話(huà)
19 李四

實(shí)現(xiàn)

常規(guī)思路一般用groub by ,然后再求和,再分頁(yè)。

查第一頁(yè)

SELECT
	t.name,
	COUNT(1) as num 
FROM
	test t 
WHERE
	1 = 1 
GROUP BY t.`name`
ORDER BY
	num DESC 
	LIMIT 0,
	5

查詢(xún)結(jié)果是這樣的:

name num
李四 3
無(wú)話(huà) 3
張三 2
大炮 2
狐貍 2

查第二頁(yè)


SELECT
	t.name,
	COUNT(1) as num 
FROM
	test t 
WHERE
	1 = 1 
GROUP BY t.`name`
ORDER BY
	num DESC 
	LIMIT 5,
	5

查詢(xún)結(jié)果是這樣的:

name num
狐貍 2
武器 1
劉可 1
敗給 1
事變 1

結(jié)果分析

顯然第二頁(yè)的'狐貍'不應(yīng)該出現(xiàn),他是第一頁(yè)的最后一條數(shù)據(jù)。這個(gè)問(wèn)題在mysql官方是給予了答案的,其實(shí)只要是order by 的排序字段在結(jié)果集中不唯一,排序字段一致的行他返回的結(jié)果都是無(wú)序的(可能無(wú)索引的話(huà)走堆排序),這一點(diǎn)不容易被重視,也不容易被測(cè)試所發(fā)現(xiàn)(單表一般需要較多重復(fù)數(shù)據(jù)和分頁(yè)才容易被發(fā)現(xiàn)),算是一個(gè)小坑。

優(yōu)化

方案一

網(wǎng)上一般提供的思路: 既然排序字段不是唯一的,我們一般期望唯一排序,只需要在order by 中跟上唯一標(biāo)識(shí)的字段即可(或者加索引走索引排序),像下面這樣:


SELECT
	t.name,
	COUNT(1) as num 
FROM
	test t 
WHERE
	1 = 1 
GROUP BY t.`name`
ORDER BY
	num DESC,t.id desc
	LIMIT 5,
	5

但是這種方式有個(gè)致命問(wèn)題,ORDER BY 后面接了兩個(gè)字段會(huì)讓索引失效,大數(shù)據(jù)場(chǎng)景下是不推薦這種方式的。

方案二

使用 ROW_NUMBER() OVER ( ORDER BY t.id) AS serial_number讓他按照指定方式排序,這基本也是萬(wàn)機(jī)油解決方案,對(duì)代碼侵入程度很低。但是我們這個(gè)場(chǎng)景下兩種方式效率一樣,因?yàn)楸緛?lái)num字段就沒(méi)有索引,但是當(dāng)order by 存在一個(gè)字段可以用索引的話(huà)就不一樣了。


SELECT
	t.name,
	COUNT(1) as num ,
	ROW_NUMBER() OVER ( ORDER BY t.name) AS serial_number
FROM
	test t 
WHERE
	1 = 1 
GROUP BY t.`name`
ORDER BY
	num DESC
	LIMIT 5,
	5

場(chǎng)景二: 大表查詢(xún)優(yōu)化問(wèn)題(多租戶(hù)情景下的連表查詢(xún)規(guī)范)

需求

假設(shè)有這樣一個(gè)場(chǎng)景,要求查某公司的商品出售情況的數(shù)據(jù),數(shù)據(jù)庫(kù)設(shè)計(jì)如下:

表名 備注
order 訂單表
goods 商品表
logistics 物流表
order_goods_mapping 商品與訂單關(guān)聯(lián)表
order_logistics_mapping 物流與訂單關(guān)聯(lián)表

實(shí)現(xiàn)

先不考慮數(shù)據(jù)庫(kù)設(shè)計(jì)是否合理,現(xiàn)在要分頁(yè)查詢(xún)商品銷(xiāo)售情況,在不考慮數(shù)據(jù)量的情況下一般這樣寫(xiě)sql(偽sql):


select g.*,o.*,l.* from goods g
join order_goods_mapping ogm on(ogm.goods_id= g.goods_id)
join order o on(o.order_id= ogm.order_id)
join order_logistics_mapping olg on(olg.order_id = o.order_id)
join logistics l on(l.logistics_id = olg.logistics_id)

where l.company_id = #{companyId} limit 0,10

這些xxxid字段索引都有,當(dāng)數(shù)據(jù)庫(kù)較小的時(shí)候看上去沒(méi)有任務(wù)問(wèn)題。但是假設(shè)商品有1億種商品,這個(gè)sql可以預(yù)見(jiàn)性的劇卡。因?yàn)閖oin操作匹配本來(lái)就是nnn這樣的操作,由于只限制了logistics 的company_id,所以查詢(xún)出來(lái)的數(shù)據(jù)量依舊是巨大的。(親身經(jīng)歷的一次因?yàn)槁樵?xún),導(dǎo)致上線(xiàn)失敗的根本原因)

優(yōu)化

要限制每張表的數(shù)據(jù)盡可能少,一般多租戶(hù)場(chǎng)景下,每張表要有租戶(hù)id, 這樣就可以按租戶(hù)維度進(jìn)行數(shù)據(jù)隔離。由于很多時(shí)候我們沒(méi)有遇到過(guò)大表的情況,所以基本租戶(hù)隔離技術(shù)在sql聯(lián)表查詢(xún)沒(méi)有體現(xiàn)出來(lái),往往只是限制了聯(lián)表的某一張表的租戶(hù)id等于登錄的租戶(hù)id,這是不可取的(有意思的是:難怪現(xiàn)在流行的多租戶(hù)方案要求每張表都要有租戶(hù)id,除了分庫(kù)分表有用,查詢(xún)優(yōu)化也體現(xiàn)出了數(shù)據(jù)隔離的優(yōu)勢(shì),一個(gè)小小的字段竟然有這么大的作用)。優(yōu)化后的sql如下:


select g.*,o.*,l.* from goods g
join order_goods_mapping ogm on(ogm.goods_id= g.goods_id)
join order o on(o.order_id= ogm.order_id)
join order_logistics_mapping olg on(olg.order_id = o.order_id)
join logistics l on(l.logistics_id = olg.logistics_id)

where l.company_id = #{companyId} and g.company_id = #{companyId} and ogm..company_id = #{companyId} and o.company_id = #{companyId} and olg.company_id = #{companyId}limit 0,10

場(chǎng)景三: 子查詢(xún)導(dǎo)致的效率低下的問(wèn)題(縱表轉(zhuǎn)橫表的查詢(xún),本質(zhì)上是連表取交集問(wèn)題的解決思路)

需求

mysql作為關(guān)系型數(shù)據(jù)庫(kù),他對(duì)行內(nèi)關(guān)系的描述較弱,比如有這樣2個(gè)表,主表interface記錄接口表,子表itf_param記錄接口參數(shù)表。
itf_param假設(shè)構(gòu)造如下:

字段名 描述
id 主鍵
itf_id 接口id
param_name 參數(shù)名稱(chēng)
param_value 參數(shù)值

現(xiàn)在要查所有(參數(shù)名='code',參數(shù)值='12')和(參數(shù)名='route',參數(shù)值='gw')的interface記錄。

實(shí)現(xiàn)

通常我們會(huì)用如下sql實(shí)現(xiàn):


select it.* from interface it where 1=1 
and exists(
  select 1  from itf_param p where p.param_name= 'code' and p.param_value='12'
)
and exists(
  select 1  from itf_param p where p.param_name= 'route' and p.param_value='gw'
)
where 1=1 limit 0,10

在數(shù)據(jù)量少的情況下,這個(gè)sql是沒(méi)有任何問(wèn)題的,但是在大數(shù)據(jù)量場(chǎng)景下,此sql就難堪大任了,因?yàn)橐话銇?lái)講子查詢(xún)效率都會(huì)較低(這里即便分頁(yè)了也是如此,具體原因要問(wèn)DB工程師了,估摸著limit是最后被執(zhí)行,所以逐條過(guò)濾大量數(shù)據(jù)導(dǎo)致效率較低)。

優(yōu)化

通常連表查詢(xún)效率高于子查詢(xún),這里采用縱表轉(zhuǎn)橫表的方式對(duì)sql進(jìn)行優(yōu)化,如下所示(偽sql):


select it.* , 
MAX(CASE WHEN p.param_name= 'code' THEN p.param_value ELSE NULL END) AS codeParamValue,
MAX(CASE WHEN p.param_name= 'route' THEN p.param_value ELSE NULL END) AS routeParamValue,
from interface it join itf_param p on(it.itf_id = p.itf_id)
where 1=1 
group by it.*
having codeParamValue = '12' and routeParamValue='gw' 
limit 0,10 

場(chǎng)景四: mybatis二級(jí)緩存導(dǎo)致的問(wèn)題

在同一個(gè)事務(wù)里面:
po = xxxMapper.select();
po.setFile(xxx);
po = xxxMapper.select();
其中po的field字段還是xxx。雖然是調(diào)用的mapper.select()從數(shù)據(jù)庫(kù)查詢(xún)的po對(duì)象,但是以為緩存原故,field字段還是xxx,并不是數(shù)據(jù)庫(kù)中的字段。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-424692.html

到了這里,關(guān)于真實(shí)場(chǎng)景sql優(yōu)化持續(xù)更新(老司機(jī)必備)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • unity移動(dòng)端性能優(yōu)化技術(shù)整理(持續(xù)更新)

    本文主要針對(duì)一些常見(jiàn)的性能優(yōu)化的點(diǎn)進(jìn)行總結(jié)。屬于一個(gè)high level的overview。需要注意只有當(dāng)這些模塊確定成為制約幀時(shí)間的瓶頸時(shí),才能夠進(jìn)行針對(duì)性地優(yōu)化,否則可能會(huì)適得其反,事倍功半。 一般來(lái)說(shuō),移動(dòng)端性能優(yōu)化,如果同時(shí)支持ios和android,建議先從ios開(kāi)始優(yōu)化,

    2024年02月06日
    瀏覽(53)
  • 前端知識(shí)點(diǎn)、技巧、webpack、性能優(yōu)化(持續(xù)更新~)

    前端知識(shí)點(diǎn)、技巧、webpack、性能優(yōu)化(持續(xù)更新~)

    可以把? 圖片轉(zhuǎn)換成? base64? 放在src里面? ?減少服務(wù)器請(qǐng)求? 但是圖片會(huì)稍微大一點(diǎn)點(diǎn) 以上的方法不需要一個(gè)一個(gè)自己轉(zhuǎn)化 可以在webpack? 進(jìn)行 性能優(yōu)化? ?(官網(wǎng)有詳細(xì)描述)

    2024年03月10日
    瀏覽(18)
  • CTF Web SQL注入專(zhuān)項(xiàng)整理(持續(xù)更新中)

    CTF Web SQL注入專(zhuān)項(xiàng)整理(持續(xù)更新中)

    SQL注入即是指web應(yīng)用程序?qū)τ脩?hù)輸入數(shù)據(jù)的合法性沒(méi)有判斷或過(guò)濾不嚴(yán),攻擊者可以在web應(yīng)用程序中事先定義好的查詢(xún)語(yǔ)句的結(jié)尾上添加額外的SQL語(yǔ)句,在管理員不知情的情況下實(shí)現(xiàn)非法操作,以此來(lái)實(shí)現(xiàn)欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢(xún),從而進(jìn)一步得到相應(yīng)的數(shù)據(jù)

    2024年01月20日
    瀏覽(20)
  • Oracle/PL/SQL數(shù)據(jù)庫(kù)基礎(chǔ)操作(持續(xù)更新)

    Oracle/PL/SQL數(shù)據(jù)庫(kù)基礎(chǔ)操作(持續(xù)更新)

    ????????PL/SQL不是一個(gè)獨(dú)立的編程語(yǔ)言;它是Oracle編程環(huán)境中的工具。 SQL* Plus是一個(gè)互動(dòng)的工具,它可以在命令提示符下鍵入SQL和PL/SQL語(yǔ)句。這些命令發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行處理。語(yǔ)句處理之后將結(jié)果發(fā)回,并在屏幕上顯示出來(lái)。 分類(lèi) 命令 DDL create:創(chuàng)建;drop:刪除;alter:

    2024年02月09日
    瀏覽(20)
  • 【SQL注入】Sqlmap使用指南(手把手保姆版)持續(xù)更新

    【SQL注入】Sqlmap使用指南(手把手保姆版)持續(xù)更新

    官網(wǎng)下載地址:https://github.com/sqlmapproject/sqlmap sqlmap 是一款開(kāi)源的滲透測(cè)試工具,可以自動(dòng)化進(jìn)行SQL注入的檢測(cè)、利用,并能接管數(shù)據(jù)庫(kù)服務(wù)器。它具有功能強(qiáng)大的檢測(cè)引擎,為滲透測(cè)試人員提供了許多專(zhuān)業(yè)的功能并且可以進(jìn)行組合,其中包括數(shù)據(jù)庫(kù)指紋識(shí)別、數(shù)據(jù)讀取和訪(fǎng)問(wèn)

    2024年04月10日
    瀏覽(32)
  • 【vue2】vue2中的性能優(yōu)化(持續(xù)更新中)

    【vue2】vue2中的性能優(yōu)化(持續(xù)更新中)

    ? v-for 遍歷避免同時(shí)使用 v-if ? v-for 中的key綁定唯一的值 ? v-show與v-if對(duì)性能的影響 ? 妙用計(jì)算屬性 ? 使用防抖與節(jié)流控制發(fā)送頻率 ? 路由守衛(wèi)處理請(qǐng)求避免重復(fù)發(fā)送請(qǐng)求 ? 使用第三方UI庫(kù)的引入方式 【前言】 該系列是博主在使用vue2開(kāi)發(fā)項(xiàng)目中常用上的一些小Tips,學(xué)

    2024年01月16日
    瀏覽(19)
  • mmpose關(guān)鍵點(diǎn)(四):優(yōu)化關(guān)鍵點(diǎn)模型(原理與代碼講解,持續(xù)更新)

    mmpose關(guān)鍵點(diǎn)(四):優(yōu)化關(guān)鍵點(diǎn)模型(原理與代碼講解,持續(xù)更新)

    在工程中,模型的運(yùn)行速度與精度是同樣重要的,本文中,我會(huì)運(yùn)用不同的方法去優(yōu)化比較模型的性能,希望能給大家?guī)?lái)一些實(shí)用的trick與經(jīng)驗(yàn)。 有關(guān)鍵點(diǎn)檢測(cè)相關(guān)經(jīng)驗(yàn)的同學(xué)應(yīng)該知道,關(guān)鍵點(diǎn)主流方法分為Heatmap-based與Regression-based。 其主要區(qū)別在于監(jiān)督信息的不同,Hea

    2024年02月08日
    瀏覽(29)
  • MySQL 數(shù)據(jù)存儲(chǔ)和優(yōu)化------MySQL索引原理和優(yōu)化 ---- (架構(gòu)---索引---事務(wù)---鎖---集群---性能---分庫(kù)分表---實(shí)戰(zhàn)---運(yùn)維)持續(xù)更新

    MySQL 數(shù)據(jù)存儲(chǔ)和優(yōu)化------MySQL索引原理和優(yōu)化 ---- (架構(gòu)---索引---事務(wù)---鎖---集群---性能---分庫(kù)分表---實(shí)戰(zhàn)---運(yùn)維)持續(xù)更新

    Mysql架構(gòu)體系全系列文章主目錄(進(jìn)不去說(shuō)明還沒(méi)寫(xiě)完) https://blog.csdn.net/grd_java/article/details/123033016 本文只是整個(gè)系列筆記的第二章:MySQL索引原理和優(yōu)化,只解釋索引相關(guān)概念。 索引可以提高查詢(xún)效率,影響where查詢(xún)和order by排序,它可以從多方面進(jìn)行分類(lèi),但是實(shí)際創(chuàng)建時(shí)

    2024年02月02日
    瀏覽(24)
  • 「ABAP」萬(wàn)字詳解,一文帶你入門(mén)SAT事務(wù)碼【SQL優(yōu)化必備】

    「ABAP」萬(wàn)字詳解,一文帶你入門(mén)SAT事務(wù)碼【SQL優(yōu)化必備】

    ?? 作者簡(jiǎn)介: THUNDER王,一名熱愛(ài)財(cái)稅和SAP ABAP編程以及熱愛(ài)分享的博主。目前于江西師范大學(xué)本科在讀,同時(shí)任漢碩云(廣東)科技有限公司ABAP開(kāi)發(fā)顧問(wèn)。在學(xué)習(xí)工作中,我通常使用偏后端的開(kāi)發(fā)語(yǔ)言ABAP,SQL進(jìn)行任務(wù)的完成,對(duì)SAP企業(yè)管理系統(tǒng),SAP ABAP開(kāi)發(fā)和數(shù)據(jù)庫(kù)具有較

    2023年04月09日
    瀏覽(22)
  • Tonghttpserver6.0.1.0部署指引優(yōu)化版+基本操作指引+部分問(wèn)題收集持續(xù)更新(by lqw)

    Tonghttpserver6.0.1.0部署指引優(yōu)化版+基本操作指引+部分問(wèn)題收集持續(xù)更新(by lqw)

    輸入lscpu,確認(rèn)cpu架構(gòu): 根據(jù)cpu架構(gòu)選擇對(duì)應(yīng)的安裝包(圈起來(lái)的是x86的,另外兩個(gè)是aarch64的): 2.安裝jdk,檢查并配置jdk環(huán)境變量(這個(gè)自行百度,一般麒麟v10和國(guó)創(chuàng)的系統(tǒng)已經(jīng)自帶openjdk了,可以不用安裝,但是要配置jdk環(huán)境變量)。 3.關(guān)閉防火墻,或者放行8080(待會(huì)測(cè)

    2024年04月15日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包