? ?通常大家都會根據查詢的WHERE條件來創建合適的索引,不過這只是索引優化的一個方面。設計優秀的索引應該考慮到整個查詢,而不單單是WHERE條件部分。索引確實是一種查找數據的高效方式,但是MySQL也可以使用索引來直接獲取列的數據,這樣就不再需要讀取數據行。如果索引的葉子節點中已經包含要查詢的數據,那么還有什么必要再回到表中查詢呢? 如果一個索引覆蓋所有需要查詢的字段的值,我們就稱之為“覆蓋索引”。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名申請、虛擬空間、營銷軟件、網站建設、隆堯網站維護、網站推廣。
覆蓋索引是非常有用的工具,能夠極大地提高性能:
? ?在所有這些場景中,在索引中滿足查詢的成本一般比查詢行要小得多。
? ?不是所有類型的索引都可以成為覆蓋索引。覆蓋索引必須要存儲索引列的值,而哈希索引、空間索引和全文索引都不存儲索引列的值,所以MySQL只能使用B+Tree索引所覆蓋索引。另外,不同的存儲引擎實現覆蓋索引的方式也不同,而且不是所有的引擎都支持覆蓋索引。
? ?當發起一個唄索引覆蓋的查詢是,在EXPLAIN的Extra列可以看到“Using index”的信息。
如: explain select col1 from layout_test where col2=99
? ?索引覆蓋查詢還有很多陷阱可能會導致無法實現優化。MySQL查詢優化器會在執行查詢前判斷是否有一個索引能進行覆蓋。假設索引覆蓋了wehre條件中的字段,但不是整個查詢涉及的字段。mysql5.5和更早的版本也總是會回表獲取數據行,盡管并不需要這一行且最終會被過濾掉。
如: EXPLAIN select * from people where last_name='Allen' and first_name like '%Kim%'
這里索引無法覆蓋該查詢,有兩個原因:
這條語句只檢索1行,而之前的 like '%Kim%'要檢索3行。
也有辦法解決上面所說的兩個問題,需要重寫查詢并巧妙設計索引。
? ?這種方式叫做延遲關聯,因為延遲了對列的訪問。在查詢第一個階段MySQL可以使用覆蓋索引,因為索引包含了主鍵id的值,不需要做二次查找。
? ?在FROM子句的子查詢中找到匹配的id,然后根據這些id值在外層查詢匹配獲取需要的所有列值。雖然無法使用索引覆蓋整個查詢,但總算比完全無法利用索引覆蓋的好吧。
數據量大了怎么辦?
? ?這樣優化的效果取決于WHERE條件匹配返回的行數。假設這個people表有100萬行,我們看一下上面兩個查詢在三個不同的數據集上的表現,每個數據集都包含100萬行。
實例1中 ,查詢返回了一個很大的結果集,因此看不到優化的效果。大部分時間都花在讀取和發送數據上了。
實例2中 ,經過索引過濾,尤其是第二個條件過濾后只返回了很少的結果集,優化的效果非常明顯:在這個數據及上性能提高了很多,優化后的查詢效率主要得益于只需讀取40行完整數據行,而不是原查詢中需要的30000行。
實例3中 ,子查詢效率反而下降。因為索引過濾時符合第一個條件的結果集已經很小了,所以子查詢帶來的成本反而比從表中直接提取完整行更高。
? ?在大多數存儲引擎中,覆蓋索引只能覆蓋那些只訪問索引中部分列的查詢。不過,可以更進一步優化InnoDB?;叵胍幌?,InnoDB的二級索引的葉子節點都包含了主鍵的值,這意味著InnoDB的二級索引可以有效地利用這些額外的主鍵列來覆蓋查詢。
? ?例如,people表中last_name字段有一個二級索引,雖然該索引的列不包括主鍵id,但也能夠用于對id做覆蓋查詢:
select id,last_name from people where last_name='hua'
索引(Index)是幫助MySQL高效獲取數據的數據結構。可以得到索引的本質:索引是數據結構。
可以理解為“排好序的快速查找數據結構”
在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,
這樣就可以在這些數據結構上實現高級查找算法,這種數據結構就是索引。
我們可以通過查看索引的屬性來判斷創建索引的方法。
查看索引的語法格式如下:
SHOW INDEX FROM 表名 [ FROM 數據庫名]
語法說明如下:
表名:指定需要查看索引的數據表名。
數據庫名:指定需要查看索引的數據表所在的數據庫,可省略。比如,SHOW INDEX FROM student FROM test; 語句表示查看 test 數據庫中 student 數據表的索引。
示例
使用 SHOW INDEX 語句查看《MySQL創建索引》一節中 tb_stu_info2 數據表的索引信息,SQL 語句和運行結果如下所示。
mysql SHOW INDEX FROM tb_stu_info2\G
1. row
Table: tb_stu_info2
Non_unique: 0
Key_name: height
Seq_in_index: 1
Column_name: height
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.03 sec)
其中各主要參數說明如下:
參數 說明
Table 表示創建索引的數據表名,這里是 tb_stu_info2 數據表。
Non_unique 表示該索引是否是唯一索引。若不是唯一索引,則該列的值為 1;若是唯一索引,則該列的值為 0。
Key_name 表示索引的名稱。
Seq_in_index 表示該列在索引中的位置,如果索引是單列的,則該列的值為 1;如果索引是組合索引,則該列的值為每列在索引定義中的順序。
Column_name 表示定義索引的列字段。
Collation 表示列以何種順序存儲在索引中。在 MySQL 中,升序顯示值“A”(升序),若顯示為 NULL,則表示無分類。
Cardinality 索引中唯一值數目的估計值?;鶖蹈鶕淮鎯檎麛档慕y計數據計數,所以即使對于小型表,該值也沒有必要是精確的?;鶖翟酱?,當進行聯合時,MySQL 使用該索引的機會就越大。
Sub_part 表示列中被編入索引的字符的數量。若列只是部分被編入索引,則該列的值為被編入索引的字符的數目;若整列被編入索引,則該列的值為 NULL。
Packed 指示關鍵字如何被壓縮。若沒有被壓縮,值為 NULL。
Null 用于顯示索引列中是否包含 NULL。若列含有 NULL,該列的值為 YES。若沒有,則該列的值為 NO。
Index_type 顯示索引使用的類型和方法(BTREE、FULLTEXT、HASH、RTREE)。
Comment 顯示評注。
網頁名稱:mysql索引怎么學,MySQL索引的使用
文章起源:http://www.yijiale78.com/article8/hegcop.html
成都網站建設公司_創新互聯,為您提供云服務器、商城網站、、網站設計、搜索引擎優化、營銷型網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯