在innoDB中,有兩大索引類,分別是
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:國際域名空間、網絡空間、營銷軟件、網站建設、山陰網站維護、網站推廣。
執行上述語句,執行過程如下圖
從圖中,我們可以看出,掃了兩個索引樹
(1)先從普通索引name找到lisi
(2)再根據主鍵值9,再在聚集索引中找到行記錄。
這就是回表查詢,先在普通索引中找到主鍵值,再在聚集索引中找到行記錄。
很顯然,在一棵索引樹上就能獲取SQL所需的所有列數據的,就是索引覆蓋。
如下語句
很顯然,我們可以直接在name索引上直接找到id,name,不用再去回表。
而且我們通過explain的extra屬性也能觀察到
像我們開頭的SQL語句
我們只需要在name索引中再加個sex,name(name,sex),這樣變成了聯合索引,也是索引覆蓋。
顯示一個表所有索引的SQL語句是:
show index from 數據庫名.表名
查看某表某一列上的索引使用下面的SQL語句:
show index from 數據庫名.表名 where column_name like '列名'
下面的SQL語句在我的數據庫上執行成功:
show index from web.clubuser where column_name like 'user'。
查看索引的語法格式如下:
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 索引中唯一值數目的估計值。基數根據被存儲為整數的統計數據計數,所以即使對于小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL 使用該索引的機會就越大。
Sub_part 表示列中被編入索引的字符的數量。若列只是部分被編入索引,則該列的值為被編入索引的字符的數目;若整列被編入索引,則該列的值為 NULL。
Packed 指示關鍵字如何被壓縮。若沒有被壓縮,值為 NULL。
Null 用于顯示索引列中是否包含 NULL。若列含有 NULL,該列的值為 YES。若沒有,則該列的值為 NO。
Index_type 顯示索引使用的類型和方法(BTREE、FULLTEXT、HASH、RTREE)。
Comment 顯示評注。
首先說說索引的 優點 :最大的好處無疑就是提高查詢效率。有的索引還能保證數據的唯一性,比如唯一索引。
而它的 壞處 也很明顯:索引也是文件,我們在創建索引時,也會創建額外的文件,所以會占用一些硬盤空間。其次,索引也需要維護,我們在增加刪除數據的時候,索引也需要去變化維護。當一個表的索引多了以后,資源消耗是很大的,所以必須結合實際業務再去確定給哪些列加索引。
再說說索引的基本結構。一說到這里肯定會脫口而出:B+樹!了解B+樹前先要了解二叉查找樹和二叉平衡樹。 二叉查找樹 :左節點比父節點小,右節點比父節點大,所以二叉查找樹的中序遍歷就是樹的各個節點從小到大的排序。 二叉平衡樹 :左右子樹高度差不能大于1。B+樹就是結合了它們的特點,當然,不一定是二叉樹。
為什么要有二叉查找樹的特點?? 因為查找效率快,二分查找在這種結構下,查找效率是很快的。 那為什么要有平衡樹的特點呢? 試想,如果不維護一顆樹的平衡性,當插入一些數據后,樹的形態有可能變得很極端,比如左子樹一個數據沒有,而全在右子樹上,這種情況下,二分查找和遍歷有什么區別呢?而就是因為這些特點需要去維護,所以就有了上面提到的缺點,當索引很多后,反而增加了系統的負擔。
接著說B+樹。 它的結構如下 :
可以發現,葉子節點其實是一個 雙向循環鏈表 ,這種結構的好處就是,在范圍查詢的時候,我只用找到一個數據,就可以直接返回剩余的數據了。比如找小于30的,只用找到30,其余的直接通過葉子節點間的指針就可以找到。再說說其他特點: 數據只存在于葉子節點 。當葉子節點滿了,如果再添加數據,就會拆分葉子節點,父節點就多了個子節點。如果父節點的位置也滿了,就會擴充高度,就是拆分父節點,如25 50 75拆分成:25為左子樹,75為右子樹,50變成新的頭節點,此時B+樹的高度變成了3。它們的擴充的規律如下表,Leaf Page是葉子節點,index Page是非葉子節點。
再說說B樹 ,B樹相比較B+樹,它所有節點都存放數據,所以在查找數據時,B樹有可能沒到達葉子節點就結束了。再者,B樹的葉子節點間不存在指針。
最后說說Hash索引 ,相較于B+樹,Hash索引最大的優點就是查找數據快。但是Hash索引最大的問題就是不支持范圍查詢。試想,如果查詢小于30的數據,hash函數是根據數據的值找到其對應的位置,誰又知道小于30的有哪幾個數據。而B+樹正好相反,范圍查詢是它的強項。
附錄: Hash到底是啥?? 哈希中文名散列,哈希只是它的音譯。 為啥都說Hash快?? 首先有一塊哈希表(散列表),它的數據結構是個數組,一個任意長度的數據通過hash函數都可以變成一個固定長度的數據,叫hash值。然后通過hash值確定在數組中的位置,相同數據的hash值是相同的,所以我們存儲一個數據以后,只需O(1)的時間復雜度就可以找到數據。 那hash函數又是啥?? 算術運算或位運算,很多應用里都有hash函數,但實際運算過程大不一樣。這是Java里String的hashCode方法:
publicint hashCode() {
}
還有一個問題,hash函數計算出來的hash值有可能存在碰撞,即兩個不同的數據可能存在相同的hash值,在MySQL或其他的應用中,如Java的HashMap等,如果存在碰撞就會以當前數組位置為頭節點,轉變成一個鏈表。
說到這里也清楚了為啥Java中引用類型要同時重寫hashCode和equals了。兩個對象,實例就算一模一樣,它們的hash值也不相等, 為啥不相等?? 默認的Object的hashCode方法會根據對象來計算hash值的,實例相同,但它們還是兩個不同的對象啊,所以我們重寫hashCode時,最簡單的方法就是調用Object的hashCode方法,然后傳入該引用類型的屬性,讓hashCode方法只根據這幾個屬性來計算,那么實例相同的話,它們的hash值也會相等。等hashCode比較完后,如果相等再比較實例內容,也就是equals,確保不是hash碰撞。
索引的分類
如果我們指定了一個主鍵,那么這個主鍵就是主鍵索引。如果我們沒有指定,Mysql就會自動找一個非空的唯一索引當主鍵。如果沒有這種字段,Mysql就會創建一個大小為6字節的自增主鍵。如果有多個非空的唯一索引,那么就讓第一個定義為唯一索引的字段當主鍵,注意,是第一個定義,而不是建表時出現在前面的。
對于輔助索引來說,它們的B+樹結構稍微有點特殊,它們的葉子節點存儲的是主鍵,而不是整個數據。所以在大部分情況下,使用輔助索引查找數據,需要二次查找。但并不是所有情況都需要二次查找。比如查找的數據正好就是當前索引字段的值,那么直接返回就行。這里提一句,B+樹的key就是對應索引字段的內容。
而輔助索引又有一些分類:唯一索引:不能出現重復的值,也算一種約束。普通索引:可以重復、可以為空,一般就是查詢時用到。前綴索引:只適用于字符串類型數據,對字符串前幾個字符創建索引。全文索引:作用是檢測大文本數據中某個關鍵字,這也是搜索引擎的一種技術。
注意,聚集索引、非聚集索引和前面幾個索引的分類并不是一個層面上的。上面的幾個分類是從索引的作用來分析的。聚集、非聚集索引是從索引文件上區分的。主鍵索引就屬于聚集索引,即索引和數據存放在一起,葉子節點存放的就是數據。數據表的.idb文件就是存放該表的索引和數據。
輔助索引屬于非聚集索引,說到這也就明白了。索引和數據不存放在一起的就是非聚集索引。在MYISAM引擎中,數據表的.MYI文件包含了表的索引, 該表的 葉子節點存儲索引和索引對應數據的指針,指向.MYD文件的數據。
索引的幾點使用經驗
經常被查詢的字段;經常作為條件查詢的字段;經常用于外鍵連接或普通的連表查詢時進行相等比較字段;不為null的字段;如果是多條件查詢,最好創建聯合索引,因為聯合索引只有一個索引文件。
經常被更新的字段、不經常被查詢的字段、存在相同功能的字段
查看索引
mysql show index from tblname;
mysql show keys from tblname;
· Table
表的名稱。
· Non_unique
如果索引不能包括重復詞,則為0。如果可以,則為1。
· Key_name
索引的名稱。
· Seq_in_index
索引中的列序列號,從1開始。
· Column_name
列名稱。
· Collation
列以什么方式存儲在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。
· Cardinality
索引中唯一值的數目的估計值。通過運行ANALYZE TABLE或myisamchk -a可以更新。基數根據被存儲為整數的統計數據來計數,所以即使對于小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL使用該索引的機 會就越大。
· Sub_part
如果列只是被部分地編入索引,則為被編入索引的字符的數目。如果整列被編入索引,則為NULL。
· Packed
指示關鍵字如何被壓縮。如果沒有被壓縮,則為NULL。
· Null
如果列含有NULL,則含有YES。如果沒有,則該列含有NO。
· Index_type
用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
· Comment
mysql 添加索引后 在查詢的時候是mysql就自動從索引里面查詢了。如果需要也可以單獨根據索引查詢,這個看使用場景
MYSQL在創建索引后對索引的使用方式分為兩種:
1 由數據庫的查詢優化器自動判斷是否使用索引;
2 用戶可在寫SQL語句時強制使用索引
本文標題:mysql索引怎么查數據 mysql如何使用索引查詢
文章源于:http://m.kartarina.com/article10/hgpcgo.html
成都網站建設公司_創新互聯,為您提供服務器托管、網站維護、電子商務、網站收錄、網站營銷、網站策劃
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯