SHOW INDEX FROM tbl_name [FROM db_name]
十余年的詔安網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整詔安建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“詔安網(wǎng)站設(shè)計(jì)”,“詔安網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
例如,
mysql SHOW INDEX FROM mytable FROM mydb;
mysql SHOW INDEX FROM mydb.mytable;
SHOW KEYS是SHOW INDEX的同義詞。您也可以使用mysqlshow -k db_name tbl_name命令列舉一個(gè)表的索引。
SHOW INNODB STATUS語(yǔ)法
SHOW INNODB STATUS
SHOW INDEX會(huì)返回表索引信息。其格式與ODBC中的SQLStatistics調(diào)用相似。
SHOW INDEX會(huì)返回以下字段:
· Table
表的名稱(chēng)。
· Non_unique
如果索引不能包括重復(fù)詞,則為0。如果可以,則為1。
· Key_name
索引的名稱(chēng)。
· Seq_in_index
索引中的列序列號(hào),從1開(kāi)始。
· Column_name
列名稱(chēng)。
· Collation
列以什么方式存儲(chǔ)在索引中。在MySQL中,有值‘A’(升序)或NULL(無(wú)分類(lèi))。
· Cardinality
索引中唯一值的數(shù)目的估計(jì)值。通過(guò)運(yùn)行ANALYZE TABLE或myisamchk -a可以更新。基數(shù)根據(jù)被存儲(chǔ)為整數(shù)的統(tǒng)計(jì)數(shù)據(jù)來(lái)計(jì)數(shù),所以即使對(duì)于小型表,該值也沒(méi)有必要是精確的?;鶖?shù)越大,當(dāng)進(jìn)行聯(lián)合時(shí),MySQL使用該索引的機(jī)會(huì)就越大。
· Sub_part
如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。
· Packed
指示關(guān)鍵字如何被壓縮。如果沒(méi)有被壓縮,則為NULL。
· Null
如果列含有NULL,則含有YES。如果沒(méi)有,則該列含有NO。
· Index_type
用過(guò)的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
· Comment
多種評(píng)注。
最近在學(xué)習(xí)MySQL的存儲(chǔ)引擎和索引的知識(shí)。看了許多篇介紹MyISAM和InnoDB的索引的例子,都能理解。
像這張索引圖:
PS:該圖來(lái)自大神張洋的《MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理》一文。
但許多文章講述的都是單列索引,我很好奇 聯(lián)合索引對(duì)應(yīng)的結(jié)構(gòu)圖是怎樣的。
比方說(shuō)聯(lián)合索引 (col1, col2,col3),我知道在邏輯上是先按照col1進(jìn)行排序再按照col2進(jìn)行排序最后再按照col3進(jìn)行排序。因此如果是select * from table where col1 = 1 and col3 = 3的話(huà),只有col1的索引部分能生效。但是其物理結(jié)構(gòu)上這個(gè)聯(lián)合索引是怎樣存在的,我想不懂。
上網(wǎng)查閱了許多資料,總算有點(diǎn)眉目了。
假設(shè)這是一個(gè)多列索引(col1, col2,col3),對(duì)于葉子節(jié)點(diǎn),是這樣的:
PS:該圖改自《MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理》一文的配圖。
也就是說(shuō),聯(lián)合索引(col1, col2,col3)也是一棵B+Tree,其非葉子節(jié)點(diǎn)存儲(chǔ)的是第一個(gè)關(guān)鍵字的索引,而葉節(jié)點(diǎn)存儲(chǔ)的則是三個(gè)關(guān)鍵字col1、col2、col3三個(gè)關(guān)鍵字的數(shù)據(jù),且按照col1、col2、col3的順序進(jìn)行排序。
配圖可能不太讓人滿(mǎn)意,因?yàn)閏ol1都是不同的,也就是說(shuō)在col1就已經(jīng)能確定結(jié)果了。自己又畫(huà)了一個(gè)圖(有點(diǎn)丑),col1表示的是年齡,col2表示的是姓氏,col3表示的是名字。如下圖:
PS:對(duì)應(yīng)地址指的是數(shù)據(jù)記錄的地址。
如圖,聯(lián)合索引(年齡, 姓氏,名字),葉節(jié)點(diǎn)上data域存儲(chǔ)的是三個(gè)關(guān)鍵字的數(shù)據(jù)。且是按照年齡、姓氏、名字的順序排列的。
因此,如果執(zhí)行的是:
select * from STUDENT where 姓氏='李' and 名字='安';
或者
select * from STUDENT where 名字='安';
那么當(dāng)執(zhí)行查詢(xún)的時(shí)候,是無(wú)法使用這個(gè)聯(lián)合索引的。因?yàn)槁?lián)合索引中是先根據(jù)年齡進(jìn)行排序的。如果年齡沒(méi)有先確定,直接對(duì)姓氏和名字進(jìn)行查詢(xún)的話(huà),就相當(dāng)于亂序查詢(xún)一樣,因此索引無(wú)法生效。因此查詢(xún)是全表查詢(xún)。
如果執(zhí)行的是:
select * from STUDENT where 年齡=1 and 姓氏='李';
那么當(dāng)執(zhí)行查詢(xún)的時(shí)候,索引是能生效的,從圖中很直觀的看出,age=1的是第一個(gè)葉子節(jié)點(diǎn)的前6條記錄,在age=1的前提下,姓氏=’李’的是前3條。因此最終查詢(xún)出來(lái)的是這三條,從而能獲取到對(duì)應(yīng)記錄的地址。
如果執(zhí)行的是:
select * from STUDENT where 年齡=1 and 姓氏='黃' and 名字='安';
那么索引也是生效的。
而如果執(zhí)行的是:
select * from STUDENT where 年齡=1 and 名字='安';
那么,索引年齡部分能生效,名字部分不能生效。也就是說(shuō)索引部分生效。
因此我對(duì)聯(lián)合索引結(jié)構(gòu)的理解就是B+Tree是按照第一個(gè)關(guān)鍵字進(jìn)行索引,然后在葉子節(jié)點(diǎn)上按照第一個(gè)關(guān)鍵字、第二個(gè)關(guān)鍵字、第三個(gè)關(guān)鍵字…進(jìn)行排序。
而之所以會(huì)有最左原則,是因?yàn)槁?lián)合索引的B+Tree是按照第一個(gè)關(guān)鍵字進(jìn)行索引排列的。
聯(lián)合索引在B+樹(shù)上的結(jié)構(gòu)介紹
MySQL索引類(lèi)型包括:
(1)普通索引
這是最基本的索引,它沒(méi)有任何限制。它有以下幾種創(chuàng)建方式:
◆創(chuàng)建索引
CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR類(lèi)型,length可以小于字段實(shí)際長(zhǎng)度;如果是BLOB和TEXT類(lèi)型,必須指定 length,下同。
◆修改表結(jié)構(gòu)
ALTER mytable ADD INDEX [indexName] ON (username(length)) ◆創(chuàng)建表的時(shí)候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 刪除索引的語(yǔ)法:
DROP INDEX [indexName] ON mytable;
(2)唯一索引
它與前面的普通索引類(lèi)似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創(chuàng)建方式:
◆創(chuàng)建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length)) ◆修改表結(jié)構(gòu)
ALTER mytable ADD UNIQUE [indexName] ON (username(length)) ◆創(chuàng)建表的時(shí)候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
(3)主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時(shí)候同時(shí)創(chuàng)建主鍵索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) ); 當(dāng)然也可以用 ALTER 命令。記住:一個(gè)表只能有一個(gè)主鍵。
(4)組合索引
為了形象地對(duì)比單列索引和組合索引,為表添加多個(gè)字段:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL ); 為了進(jìn)一步榨取MySQL的效率,就要考慮建立組合索引。就是將 name, city, age建到一個(gè)索引里:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); 建表時(shí),usernname長(zhǎng)度為 16,這里用 10。這是因?yàn)橐话闱闆r下名字的長(zhǎng)度不會(huì)超過(guò)10,這樣會(huì)加速索引查詢(xún)速度,還會(huì)減少索引文件的大小,提高INSERT的更新速度。
如果分別在 usernname,city,age上建立單列索引,讓該表有3個(gè)單列索引,查詢(xún)時(shí)和上述的組合索引效率也會(huì)大不一樣,遠(yuǎn)遠(yuǎn)低于我們的組合索引。雖然此時(shí)有了三個(gè)索引,但MySQL只能用到其中的那個(gè)它認(rèn)為似乎是最有效率的單列索引。
MySQL 前綴索引能有效減小索引文件的大小,提高索引的速度。但是前綴索引也有它的壞處:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前綴索引,也不能把它們用作覆蓋索引(Covering Index)。
集一個(gè)索引包含多個(gè)列(最左前綴匹配原則)
索引列的值必須唯一,但允許有空值
全文索引為FUllText,在定義索引的列上支持值的全文查找,允許在這些索引列中插入重復(fù)值和空值,全文索引可以在CHAR,VARCHAR,TEXT類(lèi)型列上創(chuàng)建
設(shè)定主鍵后數(shù)據(jù)會(huì)自動(dòng)建立索引,InnoDB為聚簇索引
即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引
覆蓋索引是指一個(gè)查詢(xún)語(yǔ)句的執(zhí)行只用從所有就能夠得到,不必從數(shù)據(jù)表中讀取,覆蓋索引不是索引樹(shù),是一個(gè)結(jié)果,當(dāng)一條查詢(xún)語(yǔ)句符合覆蓋索引條件時(shí)候,MySQL只需要通過(guò)索引就可以返回查詢(xún)所需要的數(shù)據(jù),這樣避免了查到索引后的回表操作,減少了I/O效率
查看索引
列名解析:
刪除索引
查看:
刪除前:
刪除后:
普通的索引,沒(méi)有什么介紹
查看:(注意和前綴索引Sub_part的區(qū)別)
當(dāng)索引的列是unique的時(shí)候,會(huì)生成唯一索引,唯一索引關(guān)于null有下列兩種情況
SQLSERVER 下的唯一索引的列,允許null值,但最多允許有一個(gè)空值
MYSQL下的唯一索引的列,允許null值,并且允許多個(gè)空值
查看:
會(huì)建立兩個(gè)索引,一個(gè)非聚簇索引,一個(gè)是唯一索引
結(jié)果:
可以插入兩個(gè)空值(明人不說(shuō)暗話(huà),我喜歡MySQL)
一方面,它不會(huì)索引所有字段所有字符,會(huì)減小索引樹(shù)的大小.
另外一方面,索引只是為了區(qū)別出值,對(duì)于某些列,可能前幾位區(qū)別很大,我們就可以使用前綴索引。
一般情況下某個(gè)前綴的選擇性也是足夠高的,足以滿(mǎn)足查詢(xún)性能。對(duì)于BLOB,TEXT,或者很長(zhǎng)的VARCHAR類(lèi)型的列,必須使用前綴索引,因?yàn)镸ySQL不允許索引這些列的完整長(zhǎng)度。
查看:
查看:
復(fù)合索引的最左前綴匹配原則 :
對(duì)于復(fù)合索引,查詢(xún)?cè)谝欢l件才會(huì)使用該索引
減少開(kāi)銷(xiāo)。 建一個(gè)聯(lián)合索引(col1,col2,col3),實(shí)際相當(dāng)于建了(col1),(col1,col2),(col1,col2,col3)三個(gè)索引。每多一個(gè)索引,都會(huì)增加寫(xiě)操作的開(kāi)銷(xiāo)和磁盤(pán)空間的開(kāi)銷(xiāo)。對(duì)于大量數(shù)據(jù)的表,使用聯(lián)合索引會(huì)大大的減少開(kāi)銷(xiāo)!
覆蓋索引。 對(duì)聯(lián)合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通過(guò)遍歷索引取得數(shù)據(jù),而無(wú)需回表,這減少了很多的隨機(jī)io操作。減少io操作,特別的隨機(jī)io其實(shí)是dba主要的優(yōu)化策略。所以,在真正的實(shí)際應(yīng)用中,覆蓋索引是主要的提升性能的優(yōu)化手段之一。
效率高。 索引列越多,通過(guò)索引篩選出的數(shù)據(jù)越少。有1000W條數(shù)據(jù)的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假設(shè)假設(shè)每個(gè)條件可以篩選出10%的數(shù)據(jù),如果只有單值索引,那么通過(guò)該索引能篩選出1000W10%=100w條數(shù)據(jù),然后再回表從100w條數(shù)據(jù)中找到符合col2=2 and col3= 3的數(shù)據(jù),然后再排序,再分頁(yè);如果是聯(lián)合索引,通過(guò)索引篩選出1000w10% 10% *10%=1w。
在模糊搜索中很有效,搜索全文中的某一個(gè)字段,可以參考這篇博文
:
我們先進(jìn)行下面一個(gè)實(shí)驗(yàn)看看InnoDB下的主鍵索引的一個(gè)現(xiàn)象。
查看:
我們插入進(jìn)去的時(shí)候,數(shù)據(jù)的id都是亂序的,為什么這里最后select查詢(xún)出來(lái)的結(jié)果都是進(jìn)行了排序?
這是因?yàn)镮nnoDB索引底層實(shí)現(xiàn)的是B+tree,B+tree具有下列的特點(diǎn):
所以上面的排序是為了使用B+tree的結(jié)構(gòu) ,B+tree為了范圍搜索,將主鍵按照從小到大排序后,拆分成節(jié)點(diǎn)。后續(xù)還有新的節(jié)點(diǎn)進(jìn)入的時(shí)候,和B-tree相同的操作,會(huì)進(jìn)行分裂。
一般來(lái)說(shuō),聚簇索引的B+tree都是三層
InnoDB中主鍵索引一定是聚簇索引,聚簇索引一定是主鍵索引。
為什么這里輔助索引葉子結(jié)點(diǎn)不直接存儲(chǔ)數(shù)據(jù)呢?
MYISAM只有非聚簇索引,索引最終指向的都是物理地址。
Q:既然有回表的存在,那么聚簇索引的優(yōu)勢(shì)在哪里?
Q:主鍵索引作為聚簇索引需要注意什么
在查詢(xún)語(yǔ)句中使用LIke關(guān)鍵字進(jìn)行查詢(xún)時(shí),如果匹配字符串的第一個(gè)字符為"%",索引不會(huì)使用。如果“%”不是在第一位,索引就會(huì)使用
多列索引是在表的多個(gè)字段上創(chuàng)建的索引,滿(mǎn)足最左前綴匹配原則,索引才會(huì)被使用
查詢(xún)語(yǔ)句只有Or關(guān)鍵字時(shí)候,如果OR前后的兩個(gè)條件都是索引,這這次查詢(xún)將會(huì)使用索引,否則Or前后有一個(gè)條件的列不是索引,那么查詢(xún)中將不使用索引
一般情況下,mysql會(huì)默認(rèn)提供多種存儲(chǔ)引擎,你可以通過(guò)下面的查看:
看你的mysql現(xiàn)在已提供什么存儲(chǔ)引擎:
mysql show engines;
看你的mysql當(dāng)前默認(rèn)的存儲(chǔ)引擎:
mysql show variables like '%storage_engine%';
你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎):
mysql show create table 表名;
MySQL數(shù)據(jù)庫(kù)引擎詳解
作為Java程序員,MySQL數(shù)據(jù)庫(kù)大家平時(shí)應(yīng)該都沒(méi)少使用吧,對(duì)MySQL數(shù)據(jù)庫(kù)的引擎應(yīng)該也有所了解,這篇文章就讓我詳細(xì)的說(shuō)說(shuō)MySQL數(shù)據(jù)庫(kù)的Innodb和MyIASM兩種引擎以及其索引結(jié)構(gòu)。也來(lái)鞏固一下自己對(duì)這塊知識(shí)的掌握。
Innodb引擎
Innodb引擎提供了對(duì)數(shù)據(jù)庫(kù)ACID事務(wù)的支持,并且實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級(jí)別,關(guān)于數(shù)據(jù)庫(kù)事務(wù)與其隔離級(jí)別的內(nèi)容請(qǐng)見(jiàn)數(shù)據(jù)庫(kù)事務(wù)與其隔
離級(jí)別這篇文章。該引擎還提供了行級(jí)鎖和外鍵約束,它的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫(kù)系統(tǒng),它本身其實(shí)就是基于MySQL后臺(tái)的完整數(shù)據(jù)庫(kù)系統(tǒng),MySQL
運(yùn)行時(shí)Innodb會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是該引擎不支持FULLTEXT類(lèi)型的索引,而且它沒(méi)有保存表的行數(shù),當(dāng)SELECT
COUNT(*) FROM
TABLE時(shí)需要掃描全表。當(dāng)需要使用數(shù)據(jù)庫(kù)事務(wù)時(shí),該引擎當(dāng)然是首選。由于鎖的粒度更小,寫(xiě)操作不會(huì)鎖定全表,所以在并發(fā)較高時(shí),使用Innodb引擎
會(huì)提升效率。但是使用行級(jí)鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表。
MyIASM引擎
MyIASM是MySQL默認(rèn)的引擎,但是它沒(méi)有提供對(duì)數(shù)據(jù)庫(kù)事務(wù)的支持,也不支持行級(jí)鎖和外鍵,因此當(dāng)INSERT(插入)或UPDATE(更
新)數(shù)據(jù)時(shí)即寫(xiě)操作需要鎖定整個(gè)表,效率便會(huì)低一些。不過(guò)和Innodb不同,MyIASM中存儲(chǔ)了表的行數(shù),于是SELECT COUNT(*)
FROM
TABLE時(shí)只需要直接讀取已經(jīng)保存好的值而不需要進(jìn)行全表掃描。如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作且不需要數(shù)據(jù)庫(kù)事務(wù)的支持,那么MyIASM也是很好的選
擇。
兩種引擎的選擇
大尺寸的數(shù)據(jù)集趨向于選擇InnoDB引擎,因?yàn)樗С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫(kù)的大小決定了故障恢復(fù)的時(shí)間長(zhǎng)短,InnoDB可以利用事務(wù)日志
進(jìn)行數(shù)據(jù)恢復(fù),這會(huì)比較快。主鍵查詢(xún)?cè)贗nnoDB引擎下也會(huì)相當(dāng)快,不過(guò)需要注意的是如果主鍵太長(zhǎng)也會(huì)導(dǎo)致性能問(wèn)題,關(guān)于這個(gè)問(wèn)題我會(huì)在下文中講到。大
批的INSERT語(yǔ)句(在每個(gè)INSERT語(yǔ)句中寫(xiě)入多行,批量插入)在MyISAM下會(huì)快一些,但是UPDATE語(yǔ)句在InnoDB下則會(huì)更快一些,尤
其是在并發(fā)量大的時(shí)候。
Index——索引
索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。MyIASM和Innodb都使用了樹(shù)這種數(shù)據(jù)結(jié)構(gòu)做為索引,關(guān)于樹(shù)我也曾經(jīng)寫(xiě)過(guò)一篇文章樹(shù)是一種偉大的數(shù)據(jù)結(jié)構(gòu),只是自己的理解,有興趣的朋友可以去閱讀。下面我接著講這兩種引擎使用的索引結(jié)構(gòu),講到這里,首先應(yīng)該談一下B-Tree和B+Tree。
B-Tree和B+Tree
B+Tree是B-Tree的變種,那么我就先講B-Tree吧,相信大家都知道紅黑樹(shù),這是我前段時(shí)間學(xué)《算法》一書(shū)時(shí),實(shí)現(xiàn)的一顆紅黑樹(shù),大家
可以參考。其實(shí)紅黑樹(shù)類(lèi)似2,3-查找樹(shù),這種樹(shù)既有2叉結(jié)點(diǎn)又有3叉結(jié)點(diǎn)。B-Tree也與之類(lèi)似,它的每個(gè)結(jié)點(diǎn)做多可以有d個(gè)分支(叉),d稱(chēng)為B-
Tree的度,如下圖所示,它的每個(gè)結(jié)點(diǎn)可以有4個(gè)元素,5個(gè)分支,于是它的度為5。B-Tree中的元素是有序的,比如圖中元素7左邊的指針指向的結(jié)點(diǎn)
中的元素都小于7,而元素7和16之間的指針指向的結(jié)點(diǎn)中的元素都處于7和16之間,正是滿(mǎn)足這樣的關(guān)系,才能高效的查找:首先從根節(jié)點(diǎn)進(jìn)行二分查找,找
到就返回對(duì)應(yīng)的值,否則就進(jìn)入相應(yīng)的區(qū)間結(jié)點(diǎn)遞歸的查找,直到找到對(duì)應(yīng)的元素或找到null指針,找到null指針則表示查找失敗。這個(gè)查找是十分高效
的,其時(shí)間復(fù)雜度為O(logN)(以d為底,當(dāng)d很大時(shí),樹(shù)的高度就很低),因?yàn)槊看螜z索最多只需要檢索樹(shù)高h(yuǎn)個(gè)結(jié)點(diǎn)。
接下來(lái)就該講B+Tree了,它是B-Tree的變種,如下面兩張圖所示:
vcHLx/i85LLp0a/Qp8LKoaM8L3A+DQo8aDMgaWQ9"myisam引擎的索引結(jié)構(gòu)"MyISAM引擎的索引結(jié)構(gòu)
MyISAM引擎的索引結(jié)構(gòu)為B+Tree,其中B+Tree的數(shù)據(jù)域存儲(chǔ)的內(nèi)容為實(shí)際數(shù)據(jù)的地址,也就是說(shuō)它的索引和實(shí)際的數(shù)據(jù)是分開(kāi)的,只不過(guò)是用索引指向了實(shí)際的數(shù)據(jù),這種索引就是所謂的非聚集索引。
Innodb引擎的索引結(jié)構(gòu)
MyISAM引擎的索引結(jié)構(gòu)同樣也是B+Tree,但是Innodb的索引文件本身就是數(shù)據(jù)文件,即B+Tree的數(shù)據(jù)域存儲(chǔ)的就是實(shí)際的數(shù)據(jù),這種索引就是聚集索引。這個(gè)索引的key就是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。
因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒(méi)有),如果沒(méi)有顯式指定,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類(lèi)型為長(zhǎng)整形。
并且和MyISAM不同,InnoDB的輔助索引數(shù)據(jù)域存儲(chǔ)的也是相應(yīng)記錄主鍵的值而不是地址,所以當(dāng)以輔助索引查找時(shí),會(huì)先根據(jù)輔助索引找到主
鍵,再根據(jù)主鍵索引找到實(shí)際的數(shù)據(jù)。所以Innodb不建議使用過(guò)長(zhǎng)的主鍵,否則會(huì)使輔助索引變得過(guò)大。建議使用自增的字段作為主鍵,這樣B+Tree的
每一個(gè)結(jié)點(diǎn)都會(huì)被順序的填滿(mǎn),而不會(huì)頻繁的分裂調(diào)整,會(huì)有效的提升插入數(shù)據(jù)的效率。
查看索引
mysql show index from tblname;
mysql show keys from tblname;
· Table
表的名稱(chēng)。
· Non_unique
如果索引不能包括重復(fù)詞,則為0。如果可以,則為1。
· Key_name
索引的名稱(chēng)。
· Seq_in_index
索引中的列序列號(hào),從1開(kāi)始。
· Column_name
列名稱(chēng)。
· Collation
列以什么方式存儲(chǔ)在索引中。在MySQL中,有值‘A’(升序)或NULL(無(wú)分類(lèi))。
· Cardinality
索引中唯一值的數(shù)目的估計(jì)值。通過(guò)運(yùn)行ANALYZE TABLE或myisamchk -a可以更新?;鶖?shù)根據(jù)被存儲(chǔ)為整數(shù)的統(tǒng)計(jì)數(shù)據(jù)來(lái)計(jì)數(shù),所以即使對(duì)于小型表,該值也沒(méi)有必要是精確的?;鶖?shù)越大,當(dāng)進(jìn)行聯(lián)合時(shí),MySQL使用該索引的機(jī) 會(huì)就越大。
· Sub_part
如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。
· Packed
指示關(guān)鍵字如何被壓縮。如果沒(méi)有被壓縮,則為NULL。
· Null
如果列含有NULL,則含有YES。如果沒(méi)有,則該列含有NO。
· Index_type
用過(guò)的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
· Comment
名稱(chēng)欄目:怎么看mysql索引結(jié)構(gòu) Mysql索引數(shù)據(jù)結(jié)構(gòu)
標(biāo)題路徑:http://m.rwnh.cn/article0/doojpio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站改版、域名注冊(cè)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)