怎么看mysql索引结构 查看mysql索引

如何查看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怎么看索引状态SHOW INDEX FROM tbl_name [FROM db_name]
例如 ,
mysql SHOW INDEX FROM mytable FROM mydb;
mysql SHOW INDEX FROM mydb.mytable;
SHOW KEYS是SHOW INDEX的同义词 。您也可以使用mysqlshow -k db_name tbl_name命令列举一个表的索引 。
SHOW INNODB STATUS语法
SHOW INNODB STATUS
SHOW INDEX会返回表索引信息 。其格式与ODBC中的SQLStatistics调用相似 。
SHOW INDEX会返回以下字段:
· 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索引类型包括:
(1)普通索引
这是最基本的索引,它没有任何限制 。它有以下几种创建方式:
◆创建索引
CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同 。
◆修改表结构
ALTER mytable ADD INDEX [indexName] ON (username(length)) ◆创建表的时候直接指定
CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL,INDEX [indexName] (username(length)));删除索引的语法:
DROP INDEX [indexName] ON mytable;
(2)唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值 。如果是组合索引,则列值的组合必须唯一 。它有以下几种创建方式:
◆创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length)) ◆修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length)) ◆创建表的时候直接指定
CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL,UNIQUE [indexName] (username(length)));
(3)主键索引
它是一种特殊的唯一索引,不允许有空值 。一般是在建表的时候同时创建主键索引:
CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL,PRIMARY KEY(ID));当然也可以用 ALTER 命令 。记?。阂桓霰碇荒苡幸桓鲋骷?。
(4)组合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:
CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL,city VARCHAR(50) NOT NULL,age INT NOT NULL);为了进一步榨取MySQL的效率,就要考虑建立组合索引 。就是将 name, city, age建到一个索引里:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); 建表时,usernname长度为 16,这里用 10 。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度 。
如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样 , 远远低于我们的组合索引 。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引 。
深入理解mysql的联合索引 最近在学习MySQL的存储引擎和索引的知识 。看了许多篇介绍MyISAM和InnoDB的索引的例子,都能理解 。
像这张索引图:
PS:该图来自大神张洋的《MySQL索引背后的数据结构及算法原理》一文 。
但许多文章讲述的都是单列索引,我很好奇 联合索引对应的结构图是怎样的 。
比方说联合索引 (col1, col2,col3),我知道在逻辑上是先按照col1进行排序再按照col2进行排序最后再按照col3进行排序 。因此如果是select * from table where col1 = 1 and col3 = 3的话 , 只有col1的索引部分能生效 。但是其物理结构上这个联合索引是怎样存在的,我想不懂 。
上网查阅了许多资料,总算有点眉目了 。
假设这是一个多列索引(col1, col2,col3),对于叶子节点,是这样的:
PS:该图改自《MySQL索引背后的数据结构及算法原理》一文的配图 。
也就是说,联合索引(col1, col2,col3)也是一棵B Tree,其非叶子节点存储的是第一个关键字的索引,而叶节点存储的则是三个关键字col1、col2、col3三个关键字的数据 , 且按照col1、col2、col3的顺序进行排序 。
配图可能不太让人满意 , 因为col1都是不同的 , 也就是说在col1就已经能确定结果了 。自己又画了一个图(有点丑),col1表示的是年龄,col2表示的是姓氏,col3表示的是名字 。如下图:
PS:对应地址指的是数据记录的地址 。
如图 , 联合索引(年龄, 姓氏,名字),叶节点上data域存储的是三个关键字的数据 。且是按照年龄、姓氏、名字的顺序排列的 。
因此,如果执行的是:
select * from STUDENT where 姓氏='李' and 名字='安';
或者
select * from STUDENT where 名字='安';
那么当执行查询的时候,是无法使用这个联合索引的 。因为联合索引中是先根据年龄进行排序的 。如果年龄没有先确定 , 直接对姓氏和名字进行查询的话 , 就相当于乱序查询一样,因此索引无法生效 。因此查询是全表查询 。
如果执行的是:
select * from STUDENT where 年龄=1 and 姓氏='李';
那么当执行查询的时候,索引是能生效的,从图中很直观的看出 , age=1的是第一个叶子节点的前6条记录,在age=1的前提下,姓氏=’李’的是前3条 。因此最终查询出来的是这三条,从而能获取到对应记录的地址 。
如果执行的是:
select * from STUDENT where 年龄=1 and 姓氏='黄' and 名字='安';
那么索引也是生效的 。
而如果执行的是:
select * from STUDENT where 年龄=1 and 名字='安';
那么 , 索引年龄部分能生效,名字部分不能生效 。也就是说索引部分生效 。
因此我对联合索引结构的理解就是B Tree是按照第一个关键字进行索引,然后在叶子节点上按照第一个关键字、第二个关键字、第三个关键字…进行排序 。
而之所以会有最左原则 , 是因为联合索引的B Tree是按照第一个关键字进行索引排列的 。
联合索引在B 树上的结构介绍
【怎么看mysql索引结构 查看mysql索引】怎么看mysql索引结构的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于查看mysql索引、怎么看mysql索引结构的信息别忘了在本站进行查找喔 。

    推荐阅读