MySQL SHOW INDEX 的語法解析

2021-08-31 09:45:14 字數 2973 閱讀 8029

本文主要講解一下mysql show index 的語法,以 show index from bbs_posts 為例,先看下執行效果如圖

1、table   表名

2、non_unique  如果索引不能包括重複值則為0,如果可以則為1。也就是平時所說的唯一索引

3、key_name  索引名稱,如果名字相同則表明是同乙個索引,而並不是重複,比如上圖中的第

二、三條資料,索引名稱都是index_fid_lasttime,其實是乙個聯合索引

4、seq_in_index 索引中的列序列號,從1開始。上圖中的

二、三條資料,seq_in_index乙個是1乙個是2,就是表明在聯合索引中的順序,我們就能推斷出聯合索引中索引的前後順序

5、column_name 索引的列名。

6、collation  列以什麼方式儲存在索引中,大概意思就是字元序。在mysqlshow index語法中,有值』a』(公升序)或null(無分類)。預設的型別是utf8_general_ci,這樣的大小寫不敏感,比如下面兩個sql會出現相同的查詢結果:

select * from table where content = 'yes'

select * from table where content = 'yes'

這樣可能不符合你的要求,你需要大小寫敏感的情況,你可以修改字段字符集型別,如下sql

alter table bbs_posts modify column content varchar(5000) not null collateutf8_bin;

這樣修改以後就ok了。

7、cardinality  基數的意思,表示索引中唯一值的數目的估計值。基數根據被儲存為整數的統計資料來計數,所以即使對於小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,mysql使用該索引的機會就越大。我們知道某個欄位的重複值越少越適合建索引,所以我們一般都是根據cardinality來判斷索引是否具有高選擇性,如果這個值非常小,那就需要重新評估這個字段是否適合建立索引。因為mysql資料庫中有各種不同的儲存引擎,而每種儲存引擎對於b+樹索引的實現又各不相同。所以對cardinality統計時放在儲存引擎層進行的,至於它是如何統計更新的在這裡就不再做更深入的介紹了。

8、sub_part前置索引的意思,如果列只是被部分地編入索引,則為被編入索引的字元的數目。如果整列被編入索引,則為null。如上圖所示,除了index_content那行顯示4外,其他的都是null,表明index_content是乙個長度為4的前置索引。對於blob,text,或者很長的varchar型別的列,必須使用字首索引,因為mysql不允許索引這些列的完整長度,這會讓索引變得大且慢。選擇長度的訣竅在於要選擇足夠長的字首以保證較高的選擇性,同時又不能太長以便節約空間。下面是計算前置索引長度的一般方法:    

select count(distinct left(content,3))/count(*) from bbs_posts as sel3

select count(distinct left(content,4))/count(*) from bbs_posts as sel4

select count(distinct left(content,5))/count(*) from bbs_posts as sel5

最後算出來那個長度的基數接近完整列的選擇行就ok了,完整列 select count(distinct content)/count(*) from bbs_posts

9、packed  指示關鍵字如何被壓縮。如果沒有被壓縮,則為null。壓縮一般包括壓縮傳輸協議、壓縮列解決方案和壓縮表解決方案。

10、null 如果列含有null,則含有yes。比如上圖中的lastoperatetime其中就包含null,我們知道建立索引的列是不允許為null的,單列索引不存null值,復合索引不存全為null的值,如果列允許為null,可能會得到「不符合預期」的結果集。我這裡是為了更好的給大家展示故意構造了一些資料。

11、index_type索引型別,mysql目前主要有以下幾種索引型別:fulltext,hash,btree,rtree。    

1). fulltext

即為全文索引,目前只有myisam引擎支援。其可以在create table ,alter table ,create index 使用,不過目前只有 char、varchar ,text 列上可以建立全文索引。全文索引並不是和myisam一起誕生的,它的出現是為了解決where name like 「%word%"這類針對文字的模糊查詢效率較低的問題。

2). hash

由於hash的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作為索引。    hash索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。但是,這種高效是有條件的,即只在「=」和「in」條件下高效,對於範圍查詢、排序及組合索引仍然效率不高。

3). btree    btree索引就是一種將索引值按一定的演算法,存入乙個樹形的資料結構中(二叉樹),每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。這是mysql裡預設和最常用的索引型別。

4). rtree

rtree在mysql很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有myisam、bdb、innodb、ndb、archive幾種。相對於btree,rtree的優勢在於範圍查詢。

12、 comment index_comment  注釋的意思。

MySQL SHOW INDEX語法的實際應用

mysql show index語法的實際應用 以下的文章主要描述的是 mysql show index語法的實際操作用法以及其實際檢視索引狀態 語法 的具體內容的描述,如果你對這一技術,心存好奇的話,以下的文章將會揭開它的神秘面紗。sql view plain copy show index fr...

container of 的的的原理

另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...

存在的就是合理的,發生的即是必然的。

筆者有時候會想,什麼是對,什麼是錯?對於追求某一件事情之前首先會考慮,為什麼我要做這件事情。所以經過自我分析和生活周邊環境的總結。我認為,對於乙個人來,這是在站在個體的角度上說。什麼是對的?就是你自己覺得是對的,它就是對的。不過這個只是你自己的想法。主觀上的正確,不代表客觀上也受到了別人的認可。就拿...