MySQL查詢優化技術之使用索引

2021-06-01 10:29:08 字數 1502 閱讀 9756

索引是提高查詢速度的最重要的工具。當然還有其它的一些技術可供使用,但是一般來說引起最大效能差異的都是索引的正確使用。在mysql郵件列表中,人們經常詢問那些讓查詢執行得更快的方法……

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

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

索引的優點

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

圖1:無索引的ad表

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

圖2:索引後的ad表

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

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

索引是提高查詢速度的最重要的工具。當然還有其它的一些技術可供使用,但是一般來說引起最大效能差異的都是索引的正確使用。在mysql郵件列表中,人們 經常詢問那些讓查詢執行得更快的方法。在大多數情況下,我們應該懷疑資料表上有沒有索引,並且通常在新增索引之後立即解決了問題。當然,並不總是這樣簡單 就可以解...

白話mysql 小白白話技術之MYSQL索引

這是一篇關於mysql索引技術的白話介紹篇,不知道直白的語言是否有助於你更容易理解mysql的索引技術。什麼是索引,為什麼要用索引,要回答這倆個問題,我們可以先提出mysql使用上有什麼痛點,比如說mysql的效能,更具體舉例的話,比如說mysql的查詢效能,如何能更快的查詢到需要的資料,就是mys...

2 mysql優化之使用索引優化查詢

索引是資料庫優化中最常用的也是最重要的手段之一。該篇看看索引的分類,使用場景,不能使用的場景等。索引是在mysql儲存引擎中實現的,而不是在伺服器層實現的。索引每種儲存引擎的索引不一定相同。mysql支援4種索引 衍生索引 主鍵,唯一索引,組合索引,字首索引等。hash索引適合key value查詢...