主頁 > 資料庫 > 7個工程應用中資料庫性能優化經驗分享

7個工程應用中資料庫性能優化經驗分享

2023-05-27 07:50:32 資料庫

摘要:此篇文章分別從sql執行程序、執行計劃、索引資料結構、索引查詢提速原理、聚焦索引、左前綴優化原則、自增主鍵索引這些角度談一談我們對資料庫優化的理解,

本文分享自華為云社區《工程應用中資料庫性能優化經驗小結》,作者: 葉工 ,

1、前言

現階段交付的演算法產品,絕大多數涉及到資料庫的使用,它承載的內容包括:用戶權限管理、資料集資訊、異步推論的結果、個性化配置等等,

在OCR場景下,資料集體量通常較大(一個資料集幾十萬張圖片),而資料庫往往部署在客戶共享資料庫中(同時運行大量其他業務),甚至只能和演算法鏡像共享同一臺服務器,因此在后臺研發中尤其要關心資料庫性能瓶頸,

此篇文章分別從 sql執行程序、執行計劃、索引資料結構、索引查詢提速原理、聚焦索引、左前綴優化原則、自增主鍵索引這些角度談一談我們對資料庫優化的理解,

2、ORM場景下如何獲得完整SQL陳述句

1. 線上環境可以通過連接池進行慢SQL攔截,并發出告警通知

2. 測驗階段,因為使用預編譯陳述句或ORM框架,無法獲取完整SQL時可以使用資料庫日志方式獲取

set global general_log=on;
show variables where Variable_name="general_log_file"

2.1 SQL執行程序

分析器:分析SQL,需要使用哪些表,使用哪些條件(知道要干什么)

優化器: 對各種執行程序做性能評估,挑選代價最小的執行程序,代價只是優化器認為的,不一定正確 (怎么樣做最快)

執行器:呼叫引擎介面,回傳資料,引擎是插件式,類似編程時多型,在創建表時可以選擇相應的存盤 引擎

2.2 執行計劃

SQL前加explain關鍵詞可以得到SQL的執行計劃,根據執行計劃可以判斷執行程序是否符合預期

explain
SELECT
 db_dataset.uuid AS db_dataset_uuid,
  db_dataset.NAME AS db_dataset_name,
 db_dataset.updated_at AS db_dataset_updated_at,
 db_dataset.created_at AS db_dataset_created_at,
 db_dataset.volume_dir AS db_dataset_volume_dir,
 db_dataset.max_data_count AS db_dataset_max_data_count,
 db_dataset.description AS db_dataset_description
FROM
 db_dataset
  LEFT OUTER JOIN db_manifest ON db_manifest.dataset_id = db_dataset.id AND
 db_manifest.dataset_version = 'annotation_v0'
  LEFT OUTER JOIN db_ai_data ON db_manifest.id = db_ai_data.manifest_id AND
 db_ai_data.deleted = '0'
WHERE
 db_dataset.deleted = 0
GROUP BY
  db_dataset.id

執行計劃反饋列的解釋:

select_type詳解:

type詳解:

查詢使用了何種型別,它在 SQL優化中是一個非常重要的指標,以下性能從好到壞依次是:
system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery >
index_subquery > range > index > ALL

system :當表僅有一行記錄時(系統表),資料量很少,往往不需要進行磁盤 IO,速度非常 快,

const :表示查詢時命中 primary key 主鍵或者 unique 唯一索引,或者被連接的部分是一個常量 (const)值,這類掃描效率極高,回傳資料量少,速度非常快,

eq_ref :查詢時命中主鍵 primary key 或者 unique key 索引, type 就是 eq_ref,

ref :區別于 eq_ref,ref 表示使用非唯一性索引,會找到很多個符合條件的行,

ref_or_null :這種連接型別類似于 ref,區別在于 MySQL 會額外搜索包含 NULL 值的行,

index_merge :使用了索引合并優化方法,一個查詢使用了兩個以上的索引,

EXPLAIN SELECT * FROM user_robot_relate WHERE id > 1 AND user_id = 2;

unique_subquery :替換下面的 IN 子查詢,子查詢回傳不重復的集合,

value IN (SELECT primary_key FROM single_table WHERE some_expr)

index_subquery :區別于 unique_subquery,用于非唯一索引,可以回傳重復值,

value IN (SELECT key_column FROM single_table WHERE some_expr)

range :使用索引選擇行,僅檢索給定范圍內的行,簡單點說就是針對一個有索引的欄位,給定 范圍檢索資料,在 where 陳述句中使用 bettween...and、<、>、<=、in 等條件查詢 type 都是 range, 從結果中看到只有對設定了索引的欄位,做范圍檢索 type 才是 range,

EXPLAIN SELECT * FROM user_robot_relate WHERE id BETWEEN 2 AND 3;

index :Index 與 ALL 其實都是讀全表,區別在于 index 是遍歷索引樹讀取,而 ALL 是從硬碟中 讀取,

ALL :將遍歷全表以找到匹配的行,性能最差,

Extra :不適合在其他列中顯示的資訊,Explain 中的很多額外的資訊會在 Extra 欄位顯示,

Using index:我們在相應的 select 操作中使用了覆寫索引,通俗一點講就是查詢的列被索引覆寫,使 用到覆寫索引查詢速度會非常快,SQL 優化中理想的狀態,

Using where:查詢時未找到可用的索引,進而通過 where 條件過濾獲取所需資料,但要注意的是并不 是所有帶 where 陳述句的查詢都會顯示 Using where,

Using temporary:表示查詢后結果需要使用臨時表來存盤,一般在排序或者分組查詢時用到,

Using filesort:表示無法利用索引完成的排序操作,也就是 ORDER BY 的欄位沒有索引,通常這樣的 SQL 都是需要優化的,

Using join buffer:在我們聯表查詢的時候,如果表的連接條件沒有用到索引,需要有一個連接緩沖區 來存盤中間結果,

2.3 索引

索引時幫助MySQL高效獲取資料的排好序的資料結構

索引資料結構:

二叉樹

紅黑樹

HashTable

B-Tree

一般不用二叉樹的原因:有序資料將退化成鏈表,深度不可控,如下圖所示

通常也不能用紅黑樹的原因:雖然壓縮了深度,但深度還是不可控,海量資料查找復雜度極高

Hash表:僅支持IN查新,不支持RANGE查詢,使用hash演算法將內容進行hash處理 hash(aaaa) = 2 hash(bbbb) = 2 hash(cccc) = 4

B+ 樹:主流的索引結構

查找程序:

1. 讀取根節點所有元素,因為是有序的,可以利用二分查找,高效查找到指定區間

2. 根據指定區間檔案地址找到二級節點,讀取所有元素,

3. 找到葉子節點中指定元素位置,

2.4 索引查詢提速原理

以B+樹索引為例,

如果要查找資料專案29

1、首先進入1號塊,1號塊資料加載如記憶體,發生一次I/O

2、在記憶體中進行二分查找,發現29在17和35之前,于是鎖定P2指標,將3號塊資料加載到記憶體,又發生一次I/O

3、同理在3號塊中走P2指標鎖定8號資料塊,將8號資料塊加載到記憶體,最后發生一次I/O

4、遍歷8號塊的資料就能找到29號資料

如果沒有索引,最壞的情況是整個表格的資料塊都需要加載到記憶體,然后遍歷出結果,將產生大量的I/O開銷和對整表資料的遍歷,

2.5 聚焦索引

聚焦索引尤其適合需要進行RANGE查找的列,這是因為他的葉子節點存放的是有序的資料行,在查詢程序中可以根據WHERE的條件定位到兩端葉子節點,然后將他們之間的整個鏈表結構取出,

2.6 左前綴優化原則

工程應用中經常有一些核心表需要按照多種形式查詢,如果為每一種查詢方式都建一個索引會影響表插入和更新的性能,

考慮到聯合索引在創建時每個子列都是排好序的,比如資料表A上有一個聯合縮影(a, b, c) , 那么查詢where a = xxx ; where a = xxx and b = xxx都將命中縮影,因此可以利用這種特性按照業務需求設定少量聯合索引覆寫多種查詢需求,

假設有表A, 有如下3種高頻查詢

select xx from A where a = xxx;
select xx from A where b = xxx;
select xx from A where a = xxx and b = xxx;

最簡單的辦法是 分別給a b (a, b) 建索引,但這就過于啰嗦,按照左前綴原則,最合理的索引建法應該是 b 和 (a, b),

2.7 自增主鍵索引

1、InnoDB所有資料都是基于B+Tree存盤的,如果沒有主鍵mysql會在所有列中選擇可能唯一的列用作索 引id,如果查找不到會默認增加rowid列,

2、索引查找程序中會有大量資料比對的場景,如果使用uuid會逐位比對,效率會非常低,占用空間也會非 常大,占用過多ssd空間,存盤費用增大,

3、b+tree是有序樹,自增索引資料可以一直向后插入性能高,如果使用非自增索引,可能導致插入程序中 帶來樹分裂及平衡問題,帶來額外的性能損失,

3、常規資料庫優化順序

1、檢查SQL,查看執行計劃,是否命中索引?是否存在大量大表關聯?查詢的每個欄位都是必須的?...

2、加索引

3、磁區

4、分表

5、改表結構,減少查詢種的關聯,增加冗余欄位

6、加服務器,彈性主機加U加記憶體換SSD...

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/553557.html

標籤:SQL Server

上一篇:詳解GaussDB(DWS)用戶監控原理及應用

下一篇:返回列表

標籤雲
其他(159804) Python(38173) JavaScript(25458) Java(18138) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7213) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5343) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1948) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 7個工程應用中資料庫性能優化經驗分享

    摘要:此篇文章分別從sql執行程序、執行計劃、索引資料結構、索引查詢提速原理、聚焦索引、左前綴優化原則、自增主鍵索引這些角度談一談我們對資料庫優化的理解。 本文分享自華為云社區《工程應用中資料庫性能優化經驗小結》,作者: 葉工 。 1、前言 現階段交付的演算法產品,絕大多數涉及到資料庫的使用。它承載的 ......

    uj5u.com 2023-05-27 07:50:32 more
  • 詳解GaussDB(DWS)用戶監控原理及應用

    摘要:本文將聚焦于用戶監控的原理及應用進行介紹。 本文分享自華為云社區《GaussDB(DWS)監控工具指南(二)用戶級監控》,作者:幕后小黑爪 。 前言 資源監控是整個運維乃至整個產品生命周期重要的一環,事前及時陳述句發現故障,事后提供詳實的資料用于追查定位問題。GaussDB(DWS)整個資源監控 ......

    uj5u.com 2023-05-27 07:49:48 more
  • Doris(一) -- 簡介和安裝

    ## Doris 簡介 ### Doris 概述 Apache Doris 由百度大資料部研發 (之前叫百度 Palo,2018 年貢獻到 Apache 社區后,更名為 Doris), 在百度內部,有超過 200 個產品線在使用,部署機器超過 1000 臺,單一業務最大可達到上百 TB。 Apach ......

    uj5u.com 2023-05-27 07:48:57 more
  • 一文教會你用Apache SeaTunnel Zeta離線把資料從MySQL同步到Star

    我們介紹一下SeaTunnel支持的第一個同步場景:離線批量同步。顧名思意,離線批量同步需要用戶定義好SeaTunnel JobConfig,選擇批處理模式,作業啟動后開始同步資料,當資料同步完成后作業完成退出。 ......

    uj5u.com 2023-05-27 07:48:43 more
  • 實體講解Spring boot動態切換資料源

    摘要:本文模擬一下在主庫查詢訂單資訊查詢不到的時候,切換資料源去歷史庫里面查詢。 本文分享自華為云社區《springboot動態切換資料源》,作者:小陳沒煩惱 。 前言 在公司的系統里,由于資料量較大,所以配置了多個資料源,它會根據用戶所在的地區去查詢那一個資料庫,這樣就產生了動態切換資料源的場景。 ......

    uj5u.com 2023-05-26 15:05:07 more
  • 2萬多條茶文化網站文章內容ACCESS資料庫

    這是從一個完整的茶文化網站采集下來的完整的內容,2萬多條的記錄數幾乎包含了關于茶資訊的所有內容,而且內容格式經過嚴謹的整理不會顯示亂七八遭而是統一干爽的格式。憑此資料庫可以創建一個內容建全的茶網站。 模塊包含:茶的種類(497)、茶具知識(139)、茶農資料(1568)、茶葉技術(3437)、茶藝茶 ......

    uj5u.com 2023-05-26 14:57:32 more
  • es筆記七之聚合操作之桶聚合和矩陣聚合

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記七之聚合操作之桶聚合和矩陣聚合](https://mp.weixin.qq.com/s/SFiLEtnUqxncL-ZQj1zqgg) 桶(bucket)聚合并不像指標(metric)聚合一樣在欄位上計算,而是會創建資料的桶,我們可以理 ......

    uj5u.com 2023-05-26 14:56:57 more
  • 快速上手kettle(一)壺之簡介

    ### 一、前言 最近由于作業需要,需要用到kettle工具進行資料遷移轉換。特意找資料學習了一下,kettle基本操作算是學會了。 所學的也結合實際作業進行了驗證。為了防止以后用到忘記了,便寫了幾篇文章記錄一下。 ![快速上手kettle](https://img2023.cnblogs.com/ ......

    uj5u.com 2023-05-26 14:56:03 more
  • Elasticsearch 之 join 關聯查詢及使用場景

    在Elasticsearch這樣的分布式系統中執行類似SQL的join連接是代價是比較大的,然而,Elasticsearch卻給我們提供了基于水平擴展的兩種連接形式 ......

    uj5u.com 2023-05-26 14:55:19 more
  • SQL Server:分頁查詢

    ## 一、分頁查詢 ? 需求描述:客戶端查詢資料庫資料并顯示在表格中。在資料庫中進行一次查詢,查詢結果有1050條記錄,但表格row上限: 100,這時需要給本次查詢記錄分配 `?` 頁用來顯示? 可以通過固定公式進行計算(c偽代碼): ```c # define TABLE_SHOW_ROW 10 ......

    uj5u.com 2023-05-26 14:55:09 more