mysql索引怎么查數據 mysql如何使用索引查詢

Mysql 索引覆蓋及回表查詢

在innoDB中,有兩大索引類,分別是

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:國際域名空間、網絡空間、營銷軟件、網站建設、山陰網站維護、網站推廣。

執行上述語句,執行過程如下圖

從圖中,我們可以看出,掃了兩個索引樹

(1)先從普通索引name找到lisi

(2)再根據主鍵值9,再在聚集索引中找到行記錄。

這就是回表查詢,先在普通索引中找到主鍵值,再在聚集索引中找到行記錄。

很顯然,在一棵索引樹上就能獲取SQL所需的所有列數據的,就是索引覆蓋。

如下語句

很顯然,我們可以直接在name索引上直接找到id,name,不用再去回表。

而且我們通過explain的extra屬性也能觀察到

像我們開頭的SQL語句

我們只需要在name索引中再加個sex,name(name,sex),這樣變成了聯合索引,也是索引覆蓋。

用mysql查詢某字段是否有索引怎么做?

顯示一個表所有索引的SQL語句是:

show index from 數據庫名.表名

查看某表某一列上的索引使用下面的SQL語句:

show index from 數據庫名.表名 where column_name like '列名'

下面的SQL語句在我的數據庫上執行成功:

show index from web.clubuser where column_name like 'user'。

怎么查看表的索引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 索引中唯一值數目的估計值。基數根據被存儲為整數的統計數據計數,所以即使對于小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL 使用該索引的機會就越大。

Sub_part 表示列中被編入索引的字符的數量。若列只是部分被編入索引,則該列的值為被編入索引的字符的數目;若整列被編入索引,則該列的值為 NULL。

Packed 指示關鍵字如何被壓縮。若沒有被壓縮,值為 NULL。

Null 用于顯示索引列中是否包含 NULL。若列含有 NULL,該列的值為 YES。若沒有,則該列的值為 NO。

Index_type 顯示索引使用的類型和方法(BTREE、FULLTEXT、HASH、RTREE)。

Comment 顯示評注。

MySQL——關于索引的總結

首先說說索引的 優點 :最大的好處無疑就是提高查詢效率。有的索引還能保證數據的唯一性,比如唯一索引。

而它的 壞處 也很明顯:索引也是文件,我們在創建索引時,也會創建額外的文件,所以會占用一些硬盤空間。其次,索引也需要維護,我們在增加刪除數據的時候,索引也需要去變化維護。當一個表的索引多了以后,資源消耗是很大的,所以必須結合實際業務再去確定給哪些列加索引。

再說說索引的基本結構。一說到這里肯定會脫口而出: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索引

查看索引

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就自動從索引里面查詢了。如果需要也可以單獨根據索引查詢,這個看使用場景

MYSQL在創建索引后對索引的使用方式分為兩種:

1 由數據庫的查詢優化器自動判斷是否使用索引;

2 用戶可在寫SQL語句時強制使用索引

本文標題:mysql索引怎么查數據 mysql如何使用索引查詢
文章源于:http://m.kartarina.com/article10/hgpcgo.html

成都網站建設公司_創新互聯,為您提供服務器托管網站維護電子商務網站收錄網站營銷網站策劃

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

搜索引擎優化
主站蜘蛛池模板: 久久无码专区国产精品发布| 成年轻人电影www无码| 少妇人妻av无码专区| 久久久久亚洲AV无码网站| 亚洲av成人无码网站…| 亚洲AV无码乱码在线观看富二代| 国产精品成人一区无码| 亚洲AV无码专区在线电影成人| 人妻丰满?V无码久久不卡| 69天堂人成无码麻豆免费视频| 日韩精品无码免费专区午夜| 无码精品人妻一区二区三区影院| 亚洲AV人无码综合在线观看 | 无码精品蜜桃一区二区三区WW| 国产成人无码精品久久久性色| 亚洲成a人在线看天堂无码| 69成人免费视频无码专区| 国精品无码一区二区三区在线 | 亚洲日韩激情无码一区| 亚洲爆乳AAA无码专区| 久久亚洲精品无码aⅴ大香| 日本无码色情三级播放| 中文成人无码精品久久久不卡| 无码人妻丰满熟妇区BBBBXXXX | 国产精品无码免费播放| 亚洲AV无码国产剧情| 69天堂人成无码麻豆免费视频 | 午夜精品久久久久久久无码| 在线观看无码AV网站永久免费| 亚洲另类无码专区首页| 少妇无码一区二区三区免费| 亚洲成a人无码亚洲成av无码| 欧洲Av无码放荡人妇网站| 亚洲va中文字幕无码久久| 国产成人无码AV一区二区| 亚洲永久无码3D动漫一区| 亚洲AV无码成人精品区天堂| 亚洲AV无码一区二区二三区软件 | 亚洲AV无码久久| 无码人妻熟妇AV又粗又大 | 精品无码无人网站免费视频|