這一部分講述了索引是什麼以及索引是怎麼樣提高查詢性能的。它還討論了在某些環境中索引可能降低性能,並為你明智地選擇數據表的索引提供了一些指導方針。在下一部分中我們將討論MySQL查詢優化器,它試圖找到執行查詢的效率最高的方法。了解一些優化器的知識,作為對如何建立索引的補充,對我們是有好處的,因為這樣你才能更好地利用自己所建立的索引。某些編寫查詢的方法實際上讓索引不起作用,在一般情況下你應該避免這種情形的發生。
索引的優點
讓我們開始了解索引是如何工作的,首先有一個不帶索引的數據表。不帶索引的表僅僅是一個無序的數據行集合。例如,圖1顯示的ad表就是不帶索引的表,因此如果需要查找某個特定的公司,就必須檢查表中的每個數據行看它是否與目標值相匹配。這會導致一次完全的數據表掃描,這個過程會很慢,如果這個表很大,但是只包含少量的符合條件的記錄,那麼效率會非常低。
圖1:無索引的ad表
圖2是同樣的一張數據表,但是增加了對ad表的company_num數據列的索引。這個索引包含了ad表中的每個數據行的條目,但是索引的條目是按照company_num值排序的。現在,我們不是逐行查看以搜尋匹配的數據項,而是使用索引。假設我們查找公司13的所有數據行。我們開始掃描索引並找到了該公司的三個值。接著我們碰到了公司14的索引值,它比我們正在搜尋的值大。索引值是排過序的,因此當我們讀取了包含14的索引記錄的時候,我們就知道再也不會有更多的匹配記錄,可以結束查詢操作了。因此使用索引獲得的功效是:我們找到了匹配的數據行在哪兒終止,並能夠忽略其它的數據行。另一個功效來自使用定位算法查找第一條匹配的條目,而不需要從索引頭開始執行線性掃描(例如,二分搜索就比線性掃描要快一些)。通過使用這種方法,我們可以快速地定位第一個匹配的值,節省了大量的搜索時間。數據庫使用了多種技術來快速地定位索引值,但是在本文中我們不關心這些技術。重點是它們能夠實現,並且索引是個好東西。