<span id="plx27"><var id="plx27"></var></span>
<dfn id="plx27"><var id="plx27"></var></dfn>
  • <span id="plx27"><code id="plx27"><input id="plx27"></input></code></span>
    <menu id="plx27"></menu><menuitem id="plx27"><thead id="plx27"><input id="plx27"></input></thead></menuitem>
  • <label id="plx27"><code id="plx27"></code></label>
    <label id="plx27"><button id="plx27"></button></label>
  • 歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
    裝配圖網(wǎng)
    ImageVerifierCode 換一換
    首頁 裝配圖網(wǎng) > 資源分類 > DOCX文檔下載  

    堪稱大神級別的sql優(yōu)化精彩內(nèi)容不容錯過哦

    • 資源ID:210939824       資源大?。?span id="uoig7om" class="font-tahoma">124.82KB        全文頁數(shù):10頁
    • 資源格式: DOCX        下載積分:9.98積分
    快捷下載 游客一鍵下載
    會員登錄下載
    微信登錄下載
    三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
    二維碼
    微信掃一掃登錄
    下載資源需要9.98積分
    郵箱/手機:
    溫馨提示:
    用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
    支付方式: 支付寶    微信支付   
    驗證碼:   換一換

     
    賬號:
    密碼:
    驗證碼:   換一換
      忘記密碼?
        
    友情提示
    2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
    3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
    4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
    5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。

    堪稱大神級別的sql優(yōu)化精彩內(nèi)容不容錯過哦

    來,教你寫一手好SQL本人負責(zé)的項目主要采用阿里云數(shù)據(jù)庫 MySQL,最近頻繁出現(xiàn)慢 SQL 告警,執(zhí)行時間最長的竟然高達 5 分鐘。圖片來自 Pexels導(dǎo)出日志后分析,主要原因竟然是沒有命中索引和沒有分頁處理。其實這是非常低級的錯誤,我不禁后背一涼,團隊成員的技術(shù)水平亟待提高啊。改造這些 SQL 的過程中,總結(jié)了一些經(jīng)驗分享給大家,如果有錯誤歡迎批評指正。MySQL 性能最大數(shù)據(jù)量拋開數(shù)據(jù)量和并發(fā)數(shù),談性能都是耍流氓。MySQL 沒有限制單表最大記錄數(shù),它取決于操作系統(tǒng)對文件大小的限制。阿里巴巴 Java 開發(fā)手冊提出單表行數(shù)超過 500 萬行或者單表容量超過 2GB,才推薦分庫分表。性能由綜合因素決定,拋開業(yè)務(wù)復(fù)雜度,影響程度依次是硬件配置、MySQL 配置、數(shù)據(jù)表設(shè)計、索引優(yōu)化。500 萬這個值僅供參考,并非鐵律。我曾經(jīng)操作過超過 4 億行數(shù)據(jù)的單表,分頁查詢最新的 20 條記錄耗時 0.6 秒,SQL 語句大致是:select field_1,field_2 from table where id < #prePageMinId order by id desc limit 20 prePageMinId 是上一頁數(shù)據(jù)記錄的最小 ID。雖然當(dāng)時查詢速度還湊合,隨著數(shù)據(jù)不斷增長,有朝一日必定不堪重負。分庫分表是個周期長而風(fēng)險高的大活兒,應(yīng)該盡可能在當(dāng)前結(jié)構(gòu)上優(yōu)化,比如升級硬件、遷移歷史數(shù)據(jù)等等,實在沒轍了再分。對分庫分表感興趣的同學(xué)可以閱讀分庫分表的基本思想。最大并發(fā)數(shù)并發(fā)數(shù)是指同一時刻數(shù)據(jù)庫能處理多少個請求,由 max_connections 和 max_user_connections 決定。max_connections 是指 MySQL 實例的最大連接數(shù),上限值是 16384,max_user_connections 是指每個數(shù)據(jù)庫用戶的最大連接數(shù)。MySQL 會為每個連接提供緩沖區(qū),意味著消耗更多的內(nèi)存。如果連接數(shù)設(shè)置太高硬件吃不消,太低又不能充分利用硬件。一般要求兩者比值超過 10%,計算方法如下:max_used_connections / max_connections * 100% = 3/100 *100%  3% 查看最大連接數(shù)與響應(yīng)最大連接數(shù):show variables like '%max_connections%' show variables like '%max_user_connections%' 在配置文件 f 中修改最大連接數(shù):mysqld max_connections = 100 max_used_connections = 20 查詢耗時 0.5 秒建議將單次查詢耗時控制在 0.5 秒以內(nèi),0.5 秒是個經(jīng)驗值,源于用戶體驗的 3 秒原則。如果用戶的操作 3 秒內(nèi)沒有響應(yīng),將會厭煩甚至退出。響應(yīng)時間=客戶端 UI 渲染耗時+網(wǎng)絡(luò)請求耗時+應(yīng)用程序處理耗時+查詢數(shù)據(jù)庫耗時,0.5 秒就是留給數(shù)據(jù)庫 1/6 的處理時間。實施原則相比 NoSQL 數(shù)據(jù)庫,MySQL 是個嬌氣脆弱的家伙。它就像體育課上的女同學(xué),一點糾紛就和同學(xué)鬧別扭(擴容難),跑兩步就氣喘吁吁(容量小并發(fā)低),常常身體不適要請假(SQL 約束太多)。如今大家都會搞點分布式,應(yīng)用程序擴容比數(shù)據(jù)庫要容易得多,所以實施原則是數(shù)據(jù)庫少干活,應(yīng)用程序多干活:· 充分利用但不濫用索引,須知索引也消耗磁盤和 CPU。· 不推薦使用數(shù)據(jù)庫函數(shù)格式化數(shù)據(jù),交給應(yīng)用程序處理。· 不推薦使用外鍵約束,用應(yīng)用程序保證數(shù)據(jù)準(zhǔn)確性。· 寫多讀少的場景,不推薦使用唯一索引,用應(yīng)用程序保證唯一性。· 適當(dāng)冗余字段,嘗試創(chuàng)建中間表,用應(yīng)用程序計算中間結(jié)果,用空間換時間。· 不允許執(zhí)行極度耗時的事務(wù),配合應(yīng)用程序拆分成更小的事務(wù)。· 預(yù)估重要數(shù)據(jù)表(比如訂單表)的負載和數(shù)據(jù)增長態(tài)勢,提前優(yōu)化。數(shù)據(jù)表設(shè)計數(shù)據(jù)類型數(shù)據(jù)類型的選擇原則,更簡單或者占用空間更?。?#183; 如果長度能夠滿足,整型盡量使用 tinyint、smallint、medium_int 而非 int。· 如果字符串長度確定,采用 char 類型。· 如果 varchar 能夠滿足,不采用 text 類型。· 精度要求較高的使用 decimal 類型,也可以使用 BIGINT,比如精確兩位小數(shù)就乘以 100 后保存。· 盡量采用 timestamp 而非 datetime。相比 datetime,timestamp 占用更少的空間,以 UTC 的格式儲存自動轉(zhuǎn)換時區(qū)。避免空值MySQL 中字段為 NULL 時依然占用空間,會使索引、索引統(tǒng)計更加復(fù)雜。從 NULL 值更新到非 NULL 無法做到原地更新,容易發(fā)生索引分裂影響性能。因此盡可能將 NULL 值用有意義的值代替,也能避免 SQL 語句里面包含 is not null 的判斷。Text 類型優(yōu)化由于 Text 字段儲存大量數(shù)據(jù),表容量會很早漲上去,影響其他字段的查詢性能。建議抽取出來放在子表里,用業(yè)務(wù)主鍵關(guān)聯(lián)。索引優(yōu)化索引分類如下:· 普通索引:最基本的索引。· 組合索引:多個字段上建立的索引,能夠加速復(fù)合查詢條件的檢索。· 唯一索引:與普通索引類似,但索引列的值必須唯一,允許有空值。· 組合唯一索引:列值的組合必須唯一。· 主鍵索引:特殊的唯一索引,用于唯一標(biāo)識數(shù)據(jù)表中的某一條記錄,不允許有空值,一般用 primary key 約束。· 全文索引:用于海量文本的查詢,MySQL 5.6 之后的 InnoDB 和 MyISAM 均支持全文索引。由于查詢精度以及擴展性不佳,更多的企業(yè)選擇 Elasticsearch。索引優(yōu)化原則:· 分頁查詢很重要,如果查詢數(shù)據(jù)量超過 30%,MySQL 不會使用索引。· 單表索引數(shù)不超過 5 個、單個索引字段數(shù)不超過 5 個。· 字符串可使用前綴索引,前綴長度控制在 5-8 個字符。· 字段唯一性太低,增加索引沒有意義,如:是否刪除、性別。· 合理使用覆蓋索引,如下所示:select login_name, nick_name from member where login_name = ? login_name, nick_name 兩個字段建立組合索引,比 login_name 簡單索引要更快。SQL 優(yōu)化分批處理博主小時候看到魚塘挖開小口子放水,水面有各種漂浮物。浮萍和樹葉總能順利通過出水口,而樹枝會擋住其他物體通過,有時還會卡住,需要人工清理。MySQL 就是魚塘,最大并發(fā)數(shù)和網(wǎng)絡(luò)帶寬就是出水口,用戶 SQL 就是漂浮物。不帶分頁參數(shù)的查詢或者影響大量數(shù)據(jù)的 update 和 delete 操作,都是樹枝,我們要把它打散分批處理,下面舉例說明。業(yè)務(wù)描述:更新用戶所有已過期的優(yōu)惠券為不可用狀態(tài)。SQL 語句:update status=0 FROM coupon WHERE expire_date <= #currentDate and status=1; 如果大量優(yōu)惠券需要更新為不可用狀態(tài),執(zhí)行這條 SQL 可能會堵死其他 SQL,分批處理偽代碼如下:int pageNo = 1; int PAGE_SIZE = 100; while(true) List<Integer> batchIdList = queryList('select id FROM coupon WHERE expire_date <= #currentDate and status = 1 limit #(pageNo-1) * PAGE_SIZE,#PAGE_SIZE'); if (CollectionUtils.isEmpty(batchIdList) return; update('update status = 0 FROM coupon where status = 1 and id in #batchIdList') pageNo +; 操作符 <> 優(yōu)化通常 <> 操作符無法使用索引,舉例如下,查詢金額不為 100 元的訂單:select id from orders where amount  != 100; 如果金額為 100 的訂單極少,這種數(shù)據(jù)分布嚴(yán)重不均的情況下,有可能使用索引。鑒于這種不確定性,采用 union 聚合搜索結(jié)果,改寫方法如下:(select id from orders where amount > 100) union all (select id from orders where amount < 100 and amount > 0) OR 優(yōu)化在 Innodb 引擎下 OR 無法使用組合索引,比如:select id,product_name from orders where mobile_no = '13421800407' or user_id = 100; OR 無法命中 mobile_no + user_id 的組合索引,可采用 union,如下所示:(select id,product_name from orders where mobile_no = '13421800407') union (select id,product_name from orders where user_id = 100); 此時 id 和 product_name 字段都有索引,查詢才最高效。IN 優(yōu)化IN 適合主表大子表小,EXIST 適合主表小子表大。由于查詢優(yōu)化器的不斷升級,很多場景這兩者性能差不多一樣了。嘗試改為 Join 查詢,舉例如下:select id from orders where user_id in (select id from user where level = 'VIP'); 采用 Join 如下所示:select o.id from orders o left join user u on o.user_id = u.id where u.level = 'VIP' 不做列運算通常在查詢條件列運算會導(dǎo)致索引失效,如下所示,查詢當(dāng)日訂單:select id from order where date_format(create_time,'%Y-%m-%d') = '2019-07-01' date_format 函數(shù)會導(dǎo)致這個查詢無法使用索引,改寫后:select id from order where create_time between '2019-07-01 00:00:00' and '2019-07-01 23:59:59' 避免Select All如果不查詢表中所有的列,避免使用 SELECT *,它會進行全表掃描,不能有效利用索引。Like 優(yōu)化Like 用于模糊查詢,舉個例子(field 已建立索引):SELECT column FROM table WHERE field like '%keyword%' 這個查詢未命中索引,換成下面的寫法:SELECT column FROM table WHERE field like 'keyword%' 去除了前面的 % 查詢將會命中索引,但是產(chǎn)品經(jīng)理一定要前后模糊匹配呢?全文索引 fulltext 可以嘗試一下,但 Elasticsearch 才是終極武器。Join 優(yōu)化Join 的實現(xiàn)是采用 Nested Loop Join 算法,就是通過驅(qū)動表的結(jié)果集作為基礎(chǔ)數(shù)據(jù),通過該結(jié)數(shù)據(jù)作為過濾條件到下一個表中循環(huán)查詢數(shù)據(jù),然后合并結(jié)果。如果有多個 Join,則將前面的結(jié)果集作為循環(huán)數(shù)據(jù),再次到后一個表中查詢數(shù)據(jù)。驅(qū)動表和被驅(qū)動表盡可能增加查詢條件,滿足 ON 的條件而少用 Where,用小結(jié)果集驅(qū)動大結(jié)果集。被驅(qū)動表的 Join 字段上加上索引,無法建立索引的時候,設(shè)置足夠的 Join Buffer Size。禁止 Join 連接三個以上的表,嘗試增加冗余字段。Limit 優(yōu)化Limit 用于分頁查詢時越往后翻性能越差,解決的原則:縮小掃描范圍,如下所示:select * from orders order by id desc limit 100000,10 耗時0.4秒 select * from orders order by id desc limit 1000000,10 耗時5.2秒 先篩選出 ID 縮小查詢范圍,寫法如下:select * from orders where id > (select id from orders order by id desc limit 1000000, 1) order by id desc limit 0,10 耗時0.5秒 如果查詢條件僅有主鍵 ID,寫法如下:select id from orders where id between 1000000 and 1000010 order by id desc 耗時0.3秒 如果以上方案依然很慢呢?只好用游標(biāo)了,感興趣的朋友閱讀 JDBC 使用游標(biāo)實現(xiàn)分頁查詢的方法。其他數(shù)據(jù)庫作為一名后端開發(fā)人員,務(wù)必精通作為存儲核心的 MySQL 或 SQL Server,也要積極關(guān)注 NoSQL 數(shù)據(jù)庫,他們已經(jīng)足夠成熟并被廣泛采用,能解決特定場景下的性能瓶頸。

    注意事項

    本文(堪稱大神級別的sql優(yōu)化精彩內(nèi)容不容錯過哦)為本站會員(ta****fu)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

    溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




    關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

    copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

    備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


    本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

    欧美久久久一区二区三区,国产精品亚洲一区二区无码,亚洲国产精品综合久久20声音,亚洲国产精品无码久久久蜜芽
    <span id="plx27"><var id="plx27"></var></span>
    <dfn id="plx27"><var id="plx27"></var></dfn>
  • <span id="plx27"><code id="plx27"><input id="plx27"></input></code></span>
    <menu id="plx27"></menu><menuitem id="plx27"><thead id="plx27"><input id="plx27"></input></thead></menuitem>
  • <label id="plx27"><code id="plx27"></code></label>
    <label id="plx27"><button id="plx27"></button></label>