關聯式資料庫查詢優化的初次體驗

2021-07-16 02:13:56 字數 2962 閱讀 9493

最近一直在看關係資料庫系統知識,主要還是從概念上去了解關聯式資料庫的一些知識,之前沒有系統的學習這方面的知識,現在重新去構建這塊的知識體系。學習到關係查詢優化這塊的知識,通過對書本上的分析,了解到查詢優化這塊的知識,起初在我的知識裡,我認為rdbms會優化查詢這塊的內容,即認為所有人寫的查詢被rdbms優化後都是一種執**況。但事實上並不是這樣,rdbms有多種執行策略,但這種策略知識在已有的查詢語句的分析下進行,它依賴於查詢的語句,所以rdbms所做的優化工作其實是有限的,為了驗證這個觀點,我進行了如下實驗。

使用的關聯式資料庫為mysql

建立資料庫student

在student下建立三個表student,course,sc

相應的表結構如下:

表1. student表結構

列名型別(長度)

約束說明

snovarchar(20)

not null primary key

學號sname

varchar(20)

not null

姓名***

char(2)

not null

性別age

smallint

not null

年齡dept

varchar(20)

null

專業名稱

表2. course表結構

列名型別(長度)

約束說明

cnoint

not null primary key

課程號cname

varchar(20)

not null

課程名cpno

intnull

先修課程

credit

smallint

not null

學分表3. sc表結鉤

列名型別(長度)

約束說明

snovarchar(20)

not null foreign key (sno) references student(sno)

學號cno

intnot null foreign key (cno) references student(cno)

課程號grade

smallint

null

成績插入資料:student 100000萬條資料

course100000萬條資料

sc100000萬條資料

查詢要求:

求選修了2號課程的學生姓名。

sql1:

select student.sname from student,sc where student.sno=sc.sno and sc.cno=2;

系統可以用多種等價的關係代數表示式來完成這一查詢:

q1 = π

sname(σ

student.sno=sc.sno

∧sc.cno=2

(student×sc))

q2 = π

sname(σ

sc.cno=2

(student

∞sc))

q3 =π

sname

((student∞σ

sc.cno=2

(sc)))

q1對應的sql語句為:

select temp.sname  from (select student.sname,sc.cno as cno,sc.sno as csno from student,sc) astemp where temp.sno=temp.csno and temp.cno=2;

q2對應的sql語句為:

select temp.sname from (select sc.cno as cno,student.sname as sname from student join sc onstudent.sno=sc.sno ) as temp where temp.cno=2

q3對應的sql語句為:

select sname from student join (select sno from sc where sc.cno=2) as temp on student.sno =temp.sno;

通過檢視sql的執行計畫,觀察各個sql的執**況有何不同。

q2對應的sql語句的執行計畫:

圖1  q2 sql語句執行計畫

q3對應的sql語句的執行計畫:

圖2  q3 sql 語句執行計畫

sql1語句執行計畫:

圖3  sql1語句執行計畫

explain select sname from student join sc on student.sno = sc.sno wheresc.cno=2;語句執行計畫:

圖4  使用join進行連線的語句執行計畫

通過對執行計畫的了解,發現sql1語句與q3相對應的sql語句的執行計畫很相似,不同的是q3 中的sql多了乙個臨時表的建立,所以系統在對sql1語句採取了類似於q3 的關係代數表示式來完成查詢。

而且通過對sql1進行變形,使用join進行連線,發現其執行計畫與sql1的執行計畫一樣,說明mysqlrdbms內部還是採用了join來實現連線。

接著對各個sql的執行時間進行對比,發現q1 > q2 > q3 ≈ sql1,q1很慢很慢,q2所用時間大約是q3 的100倍。所以對於查詢的sql語句來說,不同的書寫方式會對執行效率產生很大的影響。

關聯式資料庫的查詢優化

關係查詢優化是影響關聯式資料庫管理系統效能的關鍵因素。查詢優化的優點不僅在於使用者不必考慮如何最好地表達查詢以獲得較高的效率,而且在於系統可以比使用者程式的 優化 做得更好。1.優化可以從資料字典中獲得更多統計資訊。2.如果資料庫的物理統計資訊改變了,系統可以自動對查詢進行重新優化以選擇相適應的執行...

關聯式資料庫的查詢優化策略

1 引言 隨著計算機應用技術的不斷普及和發展,資料庫系統正越來越多的走進人們的日常生活。在要求查詢結果正確無誤的同時,人們越來越關心查詢的效率問題。影響查詢效率的因素很多,諸如處理器的速度 i o速度 儲存器的容量 作業系統 採取何種的資料庫服務系統等。但是對於特定伺服器來說查詢的效率主要取決於db...

關聯式資料庫與非關聯式資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...