MySQL查詢優化技術系列講座之使用索引(一)

2021-05-09 19:23:03 字數 2166 閱讀 1268

索引是提高查詢速度的最重要的工具。當然還有其它的一些技術可供使用,但是一般來說引起最大效能差異的都是索引的正確使用。在mysql郵件列表中,人們 經常詢問那些讓查詢執行得更快的方法。在大多數情況下,我們應該懷疑資料表上有沒有索引,並且通常在新增索引之後立即解決了問題。當然,並不總是這樣簡單 就可以解決問題的,因為優化技術本來就並非總是簡單的。然而,如果沒有使用索引,在很多情況下,你試圖使用其它的方法來提高效能都是在浪費時間。首先使用 索引來獲取最大的效能提高,接著再看其它的技術是否有用。

這一部分講述了索引是什麼以 及索引是怎麼樣提高查詢效能的。它還討論了在某些環境中索引可能降低效能,並為你明智地選擇資料表的索引提供了一些指導方針。在下一部分中我們將討論 mysql查詢優化器,它試圖找到執行查詢的效率最高的方法。了解一些優化器的知識,作為對如何建立索引的補充,對我們是有好處的,因為這樣你才能更好地 利用自己所建立的索引。某些編寫查詢的方法實際上讓索引不起作用,在一般情況下你應該避免這種情形的發生。

索引的優點

讓我們開始了解索引是如何工作的,首先有乙個不帶索引的資料表。不帶索引的表僅僅是乙個無序的資料行集合。例如,圖1顯示的ad表就是不帶索引的表,因 此如果需要查詢某個特定的公司,就必須檢查表中的每個資料行看它是否與目標值相匹配。這會導致一次完全的資料表掃瞄,這個過程會很慢,如果這個表很大,但 是只包含少量的符合條件的記錄,那麼效率會非常低。

圖1:無索引的ad表

圖2是同樣的一張資料表,但是增加了對ad表的company_num資料列的索引。這個索引包含了ad表中的每個資料行的條目,但是索引的條目是按照 company_num值排序的。現在,我們不是逐行檢視以搜尋匹配的資料項,而是使用索引。假設我們查詢公司13的所有資料行。我們開始掃瞄索引並找到 了該公司的三個值。接著我們碰到了公司14的索引值,它比我們正在搜尋的值大。索引值是排過序的,因此當我們讀取了包含14的索引記錄的時候,我們就知道 再也不會有更多的匹配記錄,可以結束查詢操作了。因此使用索引獲得的功效是:我們找到了匹配的資料行在哪兒終止,並能夠忽略其它的資料行。另乙個功效來自 使用定位演算法查詢第一條匹配的條目,而不需要從索引頭開始執行線性掃瞄(例如,二分搜尋就比線性掃瞄要快一些)。通過使用這種方法,我們可以快速地定位第 乙個匹配的值,節省了大量的搜尋時間。資料庫使用了多種技術來快速地定位索引值,但是在本文中我們不關心這些技術。重點是它們能夠實現,並且索引是個好東 西。

圖2:索引後的ad表

你可能要問,我們為什麼不對資料行進行排序從而省掉索引?這樣不是也能實現同樣的搜尋速度的改善嗎?是的,如果表只有乙個索引,這樣做也可能達到相同的 效果。但是你可能新增第二個索引,那麼就無法一次使用兩種不同方法對資料行進行排序了(例如,你可能希望在顧客名稱上建立乙個索引,在顧客id號或**號 碼上建立另外乙個索引)。把與資料行相分離的條目作為索引解決了這個問題,允許我們建立多個索引。此外,索引中的行一般也比資料行短一些。當你插入或刪除 新的值的時候,移動較短的索引值比移動較長資料行的排序次序更加容易。

不同的mysql儲存引擎的索引實現的具體細節資訊是不同的。 例如,對於myisam資料表,該錶的資料行儲存在乙個資料檔案中,索引值儲存在索引檔案中。乙個資料表上可能有多個索引,但是它們都被儲存在同乙個索引 檔案中。索引檔案中的每個索引都包含乙個排序的鍵記錄(它用於快速地訪問資料檔案)陣列。

與此形成對照的是,bdb和innodb存 儲引擎沒有使用這種方法來分離資料行和索引值,儘管它們也把索引作為排序後的值集合進行操作。在預設情況下,bdb引擎使用單個檔案儲存資料和索引值。 innodb使用單個資料表空間(tablespace),在表空間中管理所有innodb表的資料和索引儲存。我們可以把innodb配置為每個表都在 自己的表空間中建立,但是即使是這樣,資料表的資料和索引也儲存在同乙個表空間檔案中。

前面的討論描述了單個表查詢環境下的索引的優點,在這種情 況下,通過減少對整個表的掃瞄,使用索引明顯地提高了搜尋的速度。當你執行涉及多表聯結(jion)查詢的時候,索引的價值就更高了。在單錶查詢中,你需 要在每個資料列上檢查的值的數量是表中資料行的數量。在多表查詢中,這個數量可能大幅度上公升,因為這個數量是這些表中資料行的數量所產生的。

假設你擁有三個未索引的表t1、t2和t3,每個表都分別包含資料列i1、i2和i3,並且每個表都包含了1000條資料行,其序號從1到1000。查詢某些值匹配的資料行組合的查詢可能如下所示:

select t1.i1, t2.i2, t3.i3

from t1, t2, t3

where t1.i1 = t2.i2 and t2.i1 = t3.i3;

XML技術系列講座(十二)

制定schema 考慮如下 xml文件 books.xml 1.0 straight talk about computers lars peterson you can comabt computer stress lars peterson carlos diaz 為上述xml 文件制定 sch...

網頁系列講座體會(1)

又是乙個忙碌的下午 晚上,為聽講座用了接近三個小時來佔位,寫了離散和線性的作業,晚上7 20聽學院院長的動員 報告講座,又使我燃起了鬥志 新的挑戰開始了!院長把我們學校歷屆參賽光榮史誇耀了一番,吼吼 我們可以和本部一拼呢 強悍。印象最深的是院長提到了一位 04級師兄,04級,那是我們學校剛剛成立的一...

C 語言系列講座(16) 動態型別查詢

動態型別查詢 我們知道,c 編譯後的pe檔案主要由il 和元資料組成,元資料為.元件提供了豐富的自描述特性,它使得我們可以在 執行時獲知元件中的型別等重要的資訊。在c 中這是通過一種稱做對映 reflection 的機制來完成的。先看乙個示例,在此首先建立乙個簡單的型別 type.cs public...