我們首先討論索引,因為它是加快查詢的最重要的工具。還有其他加快查詢的技術,但是最有效的莫過於恰當地使用索引了。
在 mysql 的郵件清單上,人們通常詢問關於使查詢更快的問題。在大量的案例中,都是因為表上沒有索引,一般只要加上索引就可以立即解決問題。但這樣也並非總是有效,因為優化並非總是那樣簡單。
然而,如果不使用索引,在許多情形下,用其他手段改善效能只會是浪費時間。應該首先考慮使用索引取得最大的效能改善,然後再尋求其他可能有幫助的技術。
本節介紹索引是什麼、它怎樣改善查詢效能、索引在什麼情況下可能會降低效能,以及怎樣為表選擇索引。
下一節,我們將討論 mysql 的查詢優化程式。
除了知道怎樣建立索引外,了解一些優化程式的知識也是有好處的,因為這樣可以更好地利用所建立的索引。某些編寫查詢的方法實際上會妨礙索引的效果,應該避免這種情況出現。
(雖然並非總會這樣。有時也會希望忽略優化程式的作用。我們也將介紹這些情況。)
索引對單個表查詢的影響
索引被用來快速找出在乙個列上用一特定值的行。沒有索引,mysql不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。表越大,花費時間越多。
如果表對於查詢的列有乙個索引,mysql能快速到達乙個位置去搜尋到資料檔案的中間,沒有必要考慮所有資料。如果乙個表有1000 行,這比順序讀取至少快100倍。注意你需要訪問幾乎所有1000行,它較快的順序讀取,因為此時我們避免磁碟尋道。
例如對下面這樣的乙個student表:
mysql>select * from student
+——+———+———+———+———+
| id | name | english | chinese | history |
+——+———+———+———+———+
| 12 | tom | 66 | 93 | 67 |
| 56 | paul | 78 | 52 | 75 |
| 10 | marry | 54 | 89 | 74 |
| 4 | tina | 99 | 83 | 48 |
| 39 | william | 43 | 96 | 52 |
| 74 | stone | 42 | 40 | 61 |
| 86 | smith | 49 | 85 | 78 |
| 37 | black | 49 | 63 | 47 |
| 89 | white | 94 | 31 | 52 |
+——+———+———+———+———+
這樣,我們試圖對它進行乙個特定查詢時,就不得不做乙個全表的掃瞄,速度很慢。
例如,我們查詢出所有english成績不及格的學生:
mysql>select name,english from student where english<60;
+———+———+
| name | english |
+———+———+
| marry | 54 |
| william | 43 |
| stone | 42 |
| smith | 49 |
| black | 49 |
+———+———+
其中,where從句不得不匹配每個記錄,以檢查是否符合條件。對於這個較小的表也許感覺不到太多的影響。但是對於乙個較大的表,例如乙個非常大的學校,我們可能需要儲存成千上萬的記錄,這樣乙個檢索的所花的時間是十分可觀的。
如果,我們為english列建立乙個索引:
mysql>alter table student add index (english) ;
+——————-+
| index for english |
+——————-+
| 42 |
| 43 |
| 49 |
| 49 |
| 54 |
| 66 |
| 78 |
| 94 |
| 99 |
+——————-+
如上表,此索引儲存在索引檔案中,包含表中每行的english列值,但此索引是在 english的基礎上排序的。現在,不需要逐行搜尋全表查詢匹配的條款,而是可以利用索引進行查詢。
假如我們要查詢分數小於60的所有行,那麼可以掃瞄索引,結果得出5行。然後到達分數為66的行,及tom的記錄,這是乙個比我們正在查詢的要大的值。
索引值是排序的,因此在讀到包含tom的記錄時,我們知道不會再有匹配的記錄,可以退出了。
如果查詢乙個值,它在索引表中某個中間點以前不會出現,那麼也有找到其第乙個匹配索引項的定位演算法,而不用進行表的順序掃瞄(如二分查詢法)。
這樣,可以快速定位到第乙個匹配的值,以節省大量搜尋時間。資料庫利用了各種各樣的快速定位索引值的技術,這些技術是什麼並不重要,重要的是它們工作正常,索引技術是個好東西。
因此在執行下述查詢
mysql>select name,english from user where english<60;
其結果為:
+———+———+
| name | english |
+———+———+
| stone | 42 |
| william | 43 |
| smith | 49 |
| black | 49 |
| marry | 54 |
+———+———+
你應該可以發現,這個結果與未索引english列之前的不同,它是排序的,原因正式如上所述。
索引對多個表查詢的影響
所有的mysql索引(primary、unique和index)在b樹中儲存。字串是自動地壓縮字首和結尾空間。
create index句法。
索引用於:
快速找出匹配乙個where子句的行。
在多個表的查詢時,執行連線時加快了與其他表中的行匹配的行的搜尋。
對特定的索引列找出max()或min()值。
如果排序或分組在乙個可用索引的最左面字首上進行(例如,order by key_part_1,key_part_2),排序或分組乙個表。如果所有鍵值部分跟隨desc,鍵以倒序被讀取。
在一些情況中,乙個查詢能被優化來檢索值,不用諮詢資料檔案。
如果對某些表的所有使用的列是數字型的並且構成某些鍵的最左面字首,為了更快,值可以從索引樹被檢索出來。
索引的弊端
一 般情況下,如果 mysql 能夠知道怎樣用索引來更快地處理查詢,它就會這樣做。這表示,在大多數情況下,如果您不對錶進行索引,則損害的是您自己的利益。可以看出,作者描繪了索引 的諸多好處。但有不利之處嗎?是的,有。實際上,這些缺點被優點所掩蓋了,但應該對它們有所了解。
首先,索引檔案要佔磁碟空間。如果有大 量的索引,索引檔案可能會比資料檔案更快地達到最大的檔案尺寸。其次,索引檔案加快了檢索,但增加了插入和刪除,以及更新索引列中的值的時間(即,降低了 大多數涉及寫入的操作的時間),因為寫操作不僅涉及資料行,而且還常常涉及索引。乙個表擁有的索引越多,則寫操作的平均效能下降就越大。
在8.4.4節記錄裝載和修改的速度中,我們將更為詳細地介紹這些效能問題,並討論怎樣解決。
總結本節介紹了索引在優化查詢中的作用,包括了索引優化查詢的原理,索引在各種情況的檢索中的益處,也包括索引的的弊端:增加了儲存的空間,使裝載資料變慢。
索引是優化查詢的最常用也是最有效的的方法,乙個資料表,尤其是容量很大的表,建立合適的索引,會使查詢的速度提高很大。
mysql 索引的使用
一 什麼是索引!學乙個技術的時候,首先要知道他是什麼,他的作用是什麼,他能幹什麼 索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就...
mysql索引的使用
索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可以有多個單列索引,但這不是組合索引。組合索引,即乙個索包含多個列。1 普通索引 這是最基本的索引,它沒有任何限制。它有以下幾種建立方式 建立索引 create index indexname on tablename column ...
mysql索引的使用
最近在學mysql,由於對索引沒怎麼接觸過,故做下筆記已被後面參考.假設我們有個公司表沒有建立索引,公司有個編號,當我們要查詢編號為13的公司 其中表中存在很多記錄關於同乙個公司的 由於公司編號沒有排序的,要查詢該公司資訊必須掃瞄全表.如果我們建立了索引,編號會排好序,當我們查詢13的公司,資料庫快...