1. 程式人生 > >資料庫索引設計及優化

資料庫索引設計及優化

1.表的索引數量不應有上限,只要所有的SQL都能夠流暢的執行。

一個頁從磁碟讀取到資料緩衝池中,一個頁包含多條記錄,我們可能需要該頁上的所有行或一部分行或一行,但花費的成本都相同,約10ms. 在計算領域中, 10ms是一個很長的時間。
10ms怎麼計算出來的:排隊時間 + 尋道時間 + 半圈旋轉時間 + 傳輸時間
Q:平均排隊時間
U: 平均驅動器繁忙度
S:平均服務時間
Q = (u/(1-u))/S

2.SQL處理過程

select * from user where sex = ‘m’ and (weight > 90 or height > 190)
如果一個索引能滿足select查詢語句所有謂詞表達式,那麼優化器就可能建立一個高效的訪問路徑。

過濾因子描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例,它主要依賴於列值的分佈情況。
組合謂詞的過濾因子可能比兩個謂詞過濾因子的乘積要低的多。
對結果集排序要意味著,即使只需要提取一條記錄,也必須物化整個結果集。

磁碟及cpu時間的基礎假設:
隨機讀 10ms
順序讀 40Mb/s

順序掃描的cpu時間
檢查一行記錄 5us
fetch 100us

select cno, fname from cust where lname = ‘jack’ and city = ‘beijing’ order by fname

如果結果集有1000行,組合謂詞lname 和 city做索引,查詢花費的時間 1 * 10ms + 1000 * 0.1 ms = 0.1s 。表沒有訪問,所需的列值都已經複製到索引中了。

星級給定:
一星 : 減少了掃描的範圍;
二星:索引的順序和查詢條件的需求一致, 不需要排序操作
三星:索引行包含查詢語句的所有列,避免訪問表操作

5.索引設計
發現不合適的索引:
1)基本問題法;是否有一個已存在的或者計劃中的索引包含where字句所引用的所有列,如果是否,可以考慮將缺少的謂詞列加到索引中
2)快速上限估演算法;

6.影響索引設計的因素
or操作符和布林謂詞
謂詞和其他謂詞之間為or操作,那麼對於優化器而言,他們也可能是困難的。可行的替代方案有全索引掃描,全表掃描,以及多索引掃描。
好的謂詞(BT謂詞),只要任何一個簡單謂詞被判定為不滿足條件,那麼這一行就可以被排除。
不好的謂詞(非BT謂詞):僅僅不滿足謂詞A或僅僅不滿足謂詞B無法排除一行記錄