在單機數據庫系統中進行優化。面臨的問題,好比說給定一個要query的sql語句,查詢優化算法的目標就是找到查詢的一個具備最小執行花費的執行計劃,若是找到了,那麼這樣的執行計劃必定具備最快的響應時間。
查詢語句可表示成一顆二叉樹,其中葉子表明關係,內部結點是運算符,表示左右子樹的鏈接關係,子樹是sql片斷或子表達式。根節點是最後運算的操做符。根節點運算以後,獲得的是sql查詢優化後的結果。這樣一棵樹就是查詢路徑。多個關係鏈接,鏈接順序不一樣,能夠得出多個相似的二叉樹。
查詢優化就是找出代價最小的二叉樹,即最優的查詢路徑。
每條路徑的生成,包括單表掃描,兩錶鏈接,多表鏈接順序,多表鏈接搜索空間等技術。算法
查詢代價估算基於cpu代價和IO代價,因此代價模型能夠用如下計算公式表示: 總代價 = IO代價 + CPU代價; cost = 計劃運行時訪問的頁面數*每一個頁面讀取的時間花費 + 權重因子*訪問元組數; 權重因子,代表IO到CPU的相關性。訪問元組數,它反映了CPU花費,存儲層是以頁面爲單位,數據以頁面的形式被讀進內存,每一個頁面上可能有多條元組,訪問元組須要解析元組結構,才能把元組上的字段讀出,這消耗的是CPU。若是是索引掃描,則還會包括索引讀取的花費。
思路二:物理優化,解決的問題有(一、從可選的單表掃描方式中,挑選什麼樣的單表掃描方式是最優的?二、對於兩個錶鏈接時,如何鏈接是最優的?三、對於多個錶鏈接,鏈接順序有多種組合,哪一種鏈接順序時最優的?對於多個錶鏈接,鏈接順序有多種組合,是否要對每種組合都探索?若是不所有探索,怎麼找到最優的一種組合?)
- 單表掃描算法(它分別有全表掃描表數據,還有局部掃描表數據。單表掃描須要從表上獲取元組,直接關聯到物理IO的讀取)
單表掃描須要把數據從存儲系統上調入內存,因此單表掃描須要考慮IO花費。
順序掃描 = 一個頁面的IO花費*數據頁面數量 + 一個元組從頁面中解析的cpu花費*元組數;
索引及其餘方式掃描 = 一個頁面的IO花費*索引頁面數量 + 一個元組從頁面中解析的cpu花費*索引做用下的可用元組數元組數*權重因子
);
一、索引
索引是什麼?
答:索引是創建在表上,本質上是經過索引直接定位表的物理元組,加快數據獲取的方式,因此索引優化就歸屬到物理查詢優化階段。
使用索引的原則是什麼?
答:索引列做爲條件出如今where,having,on子句中,或者主鍵,須要在某元素上Max min以及排序,比較符爲>,<,between and的列,這樣有利於利用索引過濾元組。而若是用不等於<>不能夠作索引掃描。
注意事項?
答:索引列出如今目標列,一般不可以使用索引。(使用min,max目標列除外),不是你規定了某個列爲索引後,就必定會索引掃描,索引掃描須要知足使用條件。掃描方式的選取取決於代價估算模型對每種掃描試的評估。
明日繼續更~~~~~sql