一、數據庫管理系統
數據庫管理系統(Database Management System, DBMS)
衡量是否是數據庫的標准:
ACID:是指在數據庫管理系統(DBMS)中事務所具有的四個特性:
1) 原子性(Atomicity)
2) 一致性(Consistency)
3)隔離性(Isolation)
4)持久性(Durability)
1、關系型數據庫:是建立在關系數據庫模型基礎上的數據庫,借助於關系代數等概念和方法來處理數據庫中的數據,同時也是一個被組織成一組擁有正式描述性的表格,該形式的表格作用的實質是裝載着數據項的特殊收集體,這些表格中的數據能以許多不同的方式被存取或重新召集而不需要重新組織數據庫表格。
2、關系代數:
在數學中,關系代數是支持叫做逆反(converse)的對合一運算的剩余布爾代數。激發關系代數的例子是在集合X上的所有二元關系的代數,帶有R-S被解釋為平常的二元關系復合。
在數據庫中,關系代數是一階邏輯的分支,是閉合於運算下的關系的集合。運算作用於一個或多個關系上來生成一個關系。關系代數是計算機科學的一部分。
在純數學中的關系代數是有關於數理邏輯和集合論的代數結構。
關系代數是一種抽象的查詢語言,用對關系的運算來表達查詢,作為研究關系數據語言的數學工具。
關系代數的運算對象是關系,運算結果亦為關系。關系代數用到的運算符包括四類:集合運算符、專門的關系運算符、算數比較符、邏輯運算符;
數據庫關系代數的六個運算:選擇、投影、笛卡爾積(也叫"叉積"或"交叉連接")、並集、差積、重命名;

SQL的查詢語言松散的基於關系代數,盡管SQL中的操作數(表)不完全是關系,很多有用的關於關系代數的理論在SQL對應者中不成立。
二、數據庫調優
1、查詢優化技術:
數據庫查詢優化技術主要包括查詢重用技術、查詢重寫規則、查詢算法優化技術、並行查詢優化技術、分布式查詢優化技術、及其它方面(如框架結構)的優化技術,這6項技術構成了一個"廣義的數據庫查詢優化"的概念。
從優化的內容角度看,查詢優化又分為代數優化和非代數優化,或稱為邏輯優化或物理優化。邏輯優化主要依據關系代數的等價變換做一些邏輯變換;物理優化主要根據數據讀取、表連接方式、表連接順序、排序等技術對查詢進行優化。"查詢重寫規則"屬於邏輯優化,運用了關系代數和啟發式規則;"查詢算法優化"屬於物理優化,運用了基於代價估算的多表連接算法求解最小花費的技術。
2、數據庫調優(Database Tuning):
數據庫調優可以使數據庫應用運行得更快,其目標是使數據庫有更高的吞吐量(在單位時間內完成的事務越多越好)、更短的響應時間(每一個事務響應的時間越短越好)。
被調優的對象是整個數據庫管理系統總體。
查詢語句調優的對象是一條查詢語句。
3、數據庫調優的方式:
1)人工調優:主要依賴於人,效率低下;要求操作者完全理解常識所依賴的原理,還需要對應用、數據庫管理系統、操作系統以及硬件有廣泛而深刻的理解。
2)基於案例的調優:總結經典案例情況中數據庫參數的推薦配置值、數據邏輯層設計等情況,從而為用戶的調優工作提供一定的參考和借鑒。但這種方式忽略了系統的動態性和不同系統間存在的差異。
3)自調優:為數據庫系統建立一個模型,根據"影響數據庫系統性能效率的因素",數據庫系統自動進行參數配置。
4、數據庫調優主要分為五個階段:
1)第一階段:需求分析期,應用情況的估算、系統選型策略。
2)第二階段:項目設計期,數據模型的設計。
3)第三階段:開發期,SQL設計、數據庫功能的啟用。
4)第四階段:測試與運行,數據庫功能的啟用、模型系統預運行、系統監控與分析。
5)第五階段:上線與維護,系統監控與分析。
5、數據庫調優五個階段的主要技術:
1)應用情況的估算:應用的使用方式(把業務邏輯轉換為數據庫的讀寫分布邏輯,以是讀多寫少還是讀寫均衡等來區分OLTP和OLAP;應用對數據庫的並發情況、並發是否可以池化等)、數據量、對數據庫的壓力、峰值壓力等做一個預估。
2)系統選型策略:確定什么樣的數據庫可以適用應用需求,並確定數據庫是使用開源的還是商業的,是集使用群還是單機的系統,同時對操作系統、中間件、硬件、網絡等進行選型。
3)數據模型的設計:主要是根據業務邏輯設計,從幾個角度考慮表的邏輯結構,內容如下:
a)E-R模型設計:遵循E-R模型設計原理。但偶爾的適當程度的非規范化可以改善系統查詢性能。
b)數據邏輯分布策略:目的是減少數據請求的不必要的數據量,把用戶需要的數據返回;可用的技術如分區、用E-R模型分表等(如互聯網企業典型的用法,根據業務的不同,進行分庫、分表等操作)。
c)數據物理存儲策略:目的是減少IO,如啟用壓縮技術、把索引和表數據的存儲分開,不同的表數據分布於不同的表空間,不同的表空間分布在不同的物理存儲上(尤其是讀寫量大的表空間分布在不同的物理存儲上)、日志、索引和數據分布在不同的物理存儲上等。
d)索引:在查詢頻繁的對象上建立合適的索引,使索引的正效應大於負效應(索引的維護存在消耗)。
4)SQL設計:編寫正確的、查詢效率高的SQL語句。這主要依據"查詢重寫規則",編寫語句的過程中要注意,要有意識地保障SQL能利用到索引。
5)數據庫功能的啟用:數據庫為提高性能提供了一些功能,可合理使用。
a)查詢重用:根據實際情況進行配置,可緩存查詢執行計划、查詢結果等。
b)數據庫參數的設置:可設置合適的參數如數據緩沖區等。
6)模型系統預運行。在備用系統上模擬實際運行環境,加大壓力進行系統測試,提前發現問題。
7)系統監控與分析:在工業環境下,加強對系統的運行監控和日常的分析工作,具體如下:
a)應用系統表現:收集用戶對應用系統的使用意見、系統存在的問題等。
b)OS環境監控:實時監控CPU、內存、IO等,並對比實時情況與 歷史正常情況等。
c)數據庫內部狀況監控:一些數據庫提供系統表、視圖、工具等手段,向用戶提供數據庫運行過程中內部狀況的信息,如鎖的信息,這些都需要實時監控,並對比實時情況與歷史正常情況等。
d)日志分析:在數據庫的日志、操作系統的日志中找出異常事件,定位問題。
三、查詢優化
1.查詢重用
查詢重用是指盡可能利用先前的執行結果,以達到節約查詢計算全過程的時間並減少資源消耗的目的。
查詢重用技術主要集中在兩個方面:
a) 查詢結果的重用:在緩存區中分配一塊緩存塊,存放該SQL語句文本和最后的結果集,當同樣的SQL輸入時,直接把結果返回。查詢結果的重用技術節約了查詢計划生成時間,減少了查詢執行全過程的資源消耗。
b) 查詢計划的重用:緩存一條查詢語句的執行計划及其相應語法樹結構。查詢計划的重用技術減少了查詢計划生成的時間和資源消耗。
查詢重用技術利弊:
a) 優點:節約了CPU和IO消耗。在實際的使用過程中,趨利避害,根據實際情況選用。
b) 缺點:結果集很大的話會消耗很大的內存資源,同樣的SQL不同用戶獲取的結果集可能不同。
2.查詢優化技術類型
a) 語法級:查詢語言層的優化,基於語法進行優化。
b) 代數級:查詢使用形式邏輯進行優化,運用關系代數的原理進行優化。
c) 語義級:根據完整性約束,對查詢語句進行語義理解,推知一些可優化的操作。
d) 物理級:物理優化技術,基於代價估算模型,比較得出各種執行方式中代價最小的。
3.查詢重寫
是查詢語句的一種等價轉換,即對於任何相關模式的任意狀態都會產生相同的結果。
查詢重寫的兩個目標:
a) 將查詢轉換為等價的效率更高的形式,例如將效率低的謂詞轉換為效率高的謂詞、消除重復條件等。
b) 盡量將查詢重寫為等價、簡單且不受表順序限制的形式,為物理查詢優化階段提供更多的選擇,如視圖的重寫、子查詢的合並轉換等。
查詢重寫的依據:
查詢重寫的依據是關系代數。
a) 關系代數的等價變換規則對查詢重寫提供了理論上的支持。
b) 查詢重寫后,查詢優化器可能生成多個連接路徑,可以從候選者中擇優。
查詢重寫是基於語法級、代數級、語義級的優化,可以統一歸屬到邏輯優化的范疇;基於代價估算模型是物理層面的優化,是從連接路徑中選擇代價最小的路徑的過程。
查詢重寫思路:
a) 將過程性查詢轉換為描述性查詢,如視圖重寫。
b) 將復雜的查詢(如嵌套子查詢、外連接消除、嵌套連接消除)盡可能轉換為多表連接查詢。
c) 將效率低的謂詞轉換為等價的效率高的謂詞(如等價謂詞重寫)。
d) 利用等式和不等式的性質,簡化where、having條件。
4.查詢優化算法
查詢優化,求解給定查詢語句的高效執行計划的過程。這樣的過程,包括了多種子問題求解。不同的子問題,對應了不同的解決辦法,即算法。
5.查詢計划
查詢計划,也稱為查詢樹,它由一系列內部的操作符組成,這些操作符按一定的運算關系構成查詢的一個執行方案。 簡單說,就是A表和B表先連接得到中間結果,然后再和另外的C表連接得到新的中間方式,直至所有表都被連接完畢。
- 查詢計划,二叉樹上的不同節點:
a) 單表節點:
考慮單表的數據獲取方式:
1)直接通過IO獲得數據。
2)通過索引獲取數據。
3)通過索引定位數據的位置后再經過IO到數據塊中獲取數據。
這是一個從物理存儲到內存解析成邏輯字段的過程,即符合馮·諾依曼體系結構的要求(外存數據讀入內存才能被處理)
b) 兩表節點(兩表連接節點)
1)考慮兩表以何種方式連接、代價有多大、連接路徑有哪些等。表示的是內存中的元組,怎么進行元組間的連接。此時,元組通常已經存在於內存,直接使用即可。這是一個完成用戶語義的邏輯操作,但是只是局部操作,只涉及兩個具體的關系。完成用戶全部語義(用戶連接的語義),需要配合多表的連接順序的操作。
2)不同的連接算法導致的連接效率不同,如數據量大可使用嵌套連接,數據如果有序可使用歸並連接,或先排序后使用歸並連接等。
c) 多表節點
1)考慮多表連接順序如何構成代價最少的"執行計划"。決定是AB先連接還是BC先連接,這是一個比較花費大小的運算。如果太多的連接方式被判斷,也會導致效率問題。
2)多個關系采用不同次序進行連接,花費的CPU資源、內存資源差異可能較大。
3)許多數據庫采用左深樹、右深樹、緊密樹三種方式或其中一部分對多表進行連接得到多種連接路徑。
- 生成最優查詢計划的策略:
a)基於規則優化:根據經驗或一些已經探知或被證明有效的方式,定義為"規則"(如根據關系代數得知的規則、根據經驗得知的規則等),用這些規則化簡查詢計划生成過程中符合可被簡化的操作,使用啟發式規則排除一些明顯不好的存取路徑,這就是基於規則的優化。
b)基於代價優化:根據一個代價評估模型,在生成查詢計划的過程中,計算每條存取路徑(存取路徑主要包括上述三個關系節點)的花費,然后選擇代價最小的作為子路徑,這樣直至所有表連接完畢得到一個完整的路徑。
代價計算公式:總代價 = CPU代價 + IO代價;
c)主流數據庫對於基於規則和基於代價的技術,都在使用。
基於規則優化具有操作簡單且能快速確定連接方式的優點,但這種方法只是排除了一部分不好的可能,所以得到的結果未必是最好的。
基於代價優化,是對各種可能的情況進行量化比較,從而可以得到花費最小的情況,但如果組合情況比較多則花費的判斷時間就會很多。
查詢優化器的實現,多是兩種優化策略組合使用,如MySql的PostgreSQL就采取了基於規則和代價估算的查詢優化策略。
- 查詢優化為什么要並行?
a)傳統單機數據庫系統中,給定一個查詢(Query),查詢優化算法只需找到查詢的一個具有最小執行花費的執行計划,這樣的計划必定具有最快的響應時間。
b)在並行數據庫系統中,查詢優化的目標是尋找具有最小響應時間的查詢執行計划,這需要把查詢工作分解為一些可以並行運行的子工作。一些商業數據庫提供了並行查詢的功能,用以優化查詢執行操作。
- 查詢優化並行的條件
a)系統中的可用資源(如內存,高速緩存中的數據量等)
b)CPU的數目
c)運算中的特定代數運算符
如A、B、C、D四個表進行連接,每個表的單表掃描可以並行進行;在生成四個表連接的查詢計划過程中,可選擇A和B連接的同時C和D進行連接,這樣連接操作能並行運行(操作間並行)。
- 在同一個SQL內,查詢並行可以分為:
a)操作內並行:將同一操作如單表掃描操作、兩表連接操作、排序操作等分解成多個獨立的子操作,由不同的CPU同時執行。
b)操作間並行:一條SQL查詢語句可以分解成多個子操作,由多個CPU執行。
- 在分布式數據庫系統中,查詢策略優化是查詢優化的重點
主要是數據傳輸策略,(A、B兩節點的數據進行連接,是A節點數據傳輸到B節點或是從B到A或是先各自進行過濾然后再傳輸等) 和局部處理優化(傳統的單節點數據庫的查詢優化技術)
在查詢優化策略中,數據的通信開銷是優化算法考慮的主要因素。分布式查詢優化以減少傳輸的次數和數據量作為查詢優化的目標。 分布式數據庫系統中的代價估算模型,除了考慮CPU代價和IO代價外,還要考慮通過網絡在節點間傳輸數據的代價。這是分布式並行查詢優化技術與傳統單節點數據庫系統最大不同之處。
在分布式數據庫系統中,代價估算模型為: 總代價 = IO代價 + CPU代價 + 通信代價 (通信代價通常會大於IO代價和CPU代價)
四、邏輯查詢優化
1.查詢的基本操作
a)選擇操作:對應的是限制條件(=, >, < 等),操作對象是二維表中的行。
優化方式:選擇操作下推 (如A.a=B.a AND A.a=1 可轉換成A.a=1 AND B.a=1,這樣就將A、B表的選擇條件下推到各自對應的表中去)。
目的:盡量減少連接操作前的元組數,使得中間臨時關系盡量少(元組少,連接得到的元組數就少)。
好處:這樣可能減少IO和CPU的消耗、節約內存空間。
b)投影操作:對應的SELECT查詢的目的列對象。
優化方式:投影操作下推
目的:盡量減少連接操作前的列數,使得中間臨時關系盡量小(注意:選擇操作是使元組的個數“盡量少”,投影操作是使一條元組“盡量小”)。
好處:這樣雖然不能減少IO (多數數據庫存儲方式是行存儲,元組是讀取的最基本單位,所以要想操作列則必須讀取一行數據),但可以減少連接后的中間關系的元組大小,節約內存空間。
c)連接操作:對應的是連接條件,表示兩個表連接的條件。
連接操作涉及兩個子問題:
1)多表連接中每個表被連接的順序決定着效率:如果一個查詢語句只有一個表,則這樣的語句很簡單;但如果有多個表,則會涉及表之間以什么樣的順序連接最高效。
2)多表連接每個表被連接的順序被用戶語義定義:查詢語句多表連接有着不同的語義(如是 笛卡爾積、內連接、左右連接等),這決定着表之間的前后連接次序是不能隨意更換的,否則,結果集中數據是不同的。因此,表的前后連接次序是不能隨意交換的。
2.使用explain來獲取select的詳細信息
語法:EXPLAIN [explain_type] <select expression>; explain_type 可以有如下:extended | partitions | (format=traditional | json);
EXPLAIN命令,用於顯示SQL語句的查詢執行計划。EXPLAIN為用於SELECT語句中的每個表返回一行信息。
EXPLAIN EXTENDED命令:顯示SQL語句的詳細的查詢執行計划;之后可以通過"SHOW WARNINGS"命令查看詳細信息。
SHOW WARNINGS命令:可以查看MySQL優化器優化后的SQL語句。
EXPLAIN PARTITIONS命令:顯示SQL語句的帶有分區表信息的查詢執行計划。
EXPLAIN命令的輸出格式:
TRADITIONAL:傳統類型,按行隔離,每行標識一個自操作。
JSON:JSON格式。
3.邏輯查詢優化包括的技術
a)子查詢優化 b)視圖重寫 c)等價謂詞重寫 d)條件簡化 e)外連接消除 f)嵌套連接消除 g)連接消除 h)語義優化 i)非SPJ優化
