您的位置:首页 > 数据库 > MySQL

MySQL数据库总结(11)索引

2016-03-13 14:23 211 查看
一索引类型
1唯一索引unique index 行上的值不能重复允许空值

2主键索引primary key 不能重复不允许空值一般用auto_increment列

3全文索引fulltext 只有Myisam存储引擎支持fulltext 索引一般在 CHARVARCHAR 或 TEXT 列上创建

4单列索引与多列索引

5聚簇索引

6查看一张表上所有索引

7查看匹配度

8关于全文索引的用法

9索引的创建原则

10索引的优点和缺点

二MyISAM和INNODB索引结构
简单介绍B-tree B tree树

MyISAM索引结构

Innode索引结构

MyISAM索引与InnoDB索引相比较

理解:索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料。

索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。

根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节

大多数存储引擎有更高的限制。MYSQL中索引的存储类型有两种:Btree和Hash,具体和表的存储引擎相关;

Myisam和InnoDB存储引擎只支持Btree索引Memory和Heap存储引擎可以支持Hash和Btree索引

一、索引类型

1、唯一索引:unique index 行上的值不能重复,允许空值

创建索引:

create unique index 索引名 on 表名(列名);
alter table 表名 add unique index 索引名 (列名);


删除索引:

drop index 索引名 on 表名;
alter table 表名 drop index 索引名;


2、主键索引:primary key 不能重复,不允许空值,一般用auto_increment列

creat table test2 (id int not null primary key auto_increment);


主键必唯一,但是唯一索引不一定是主键

一张表上,只能有一个主键,但是可以有一个或多个唯一索引

3、全文索引:fulltext 只有Myisam存储引擎支持fulltext 索引,一般在 CHAR、VARCHAR 或 TEXT 列上创建。

Create table 表名(
id int not null primary key anto_increment,
title varchar(100),FULLTEXT(title)
)type=MyISAM;


4、单列索引与多列索引

创建多列索引:

create table test3 (
id int not null primary key auto_increment,
uname char(8) not null default '',
password char(12) not null,
INDEX(uname,password)
)type=MyISAM;


注意:INDEX(a, b, c)可以当做a或(a, b)的索引来使用,但不能当作b、c或(b,c)的索引来使用。这是一个最左前缀的优化方法

5、聚簇索引

一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 聚簇索引确定表中数据的物理顺序。Mysql中MyISAM 表是没有聚簇索引的,innodb有(主键就是聚簇索引)

6、查看一张表上所有索引

Show index from 表名;

show index from 表名 \G 横着显示

7、查看匹配度

Select id,email,match (intro) against (‘health’) from member;

8、关于全文索引的用法

match (全文索引名) against (‘keyword’);

例:

Select * from member where match (intro) against (‘health’);

关于全文索引的停止词:

全文索引不针对非常频繁的词做索引

如 this, is,you,my 等等

全文索引:在mysql的默认情况下,对于中文意义不大

因为英文有空格,标点符号来拆分单词,进而对单词进行索引,而对中文,没有空格来隔开单词,mysql无法识别每个中文词

9、索引的创建原则:

1:不要过度索引

2:在where条件最频繁的列上加

3:尽量索引散列值,过于集中的值加索引意义不大

10、索引的优点和缺点:

索引的优点

1、通过创建唯一索引,保证数据库表每行数据的唯一性

2、大大加快数据查询速度

3、在使用分组和排序进行数据查询时,可以显著减少查询中分组和排序的时间

索引的缺点:

1、维护索引需要耗费数据库资源

2、索引需要占用磁盘空间,索引文件可能比数据文件更快达到最大文件尺寸

3、当对表的数据进行增删改的时候,因为要维护索引,速度会受到影响

二、MyISAM和INNODB索引结构

简单介绍B-tree B+ tree树

B-tree



一棵m阶的B-tree树,则有以下性质

1、Ki表示关键字值,上图中,k1小于 k2<小于…ki小于 k0小于Kn(可以看出,一个节点的左子节点关键字值<该关键字值<右子节点关键字值)

2、Pi表示指向子节点的指针,左指针指向左子节点,右指针指向右子节点。即是:p1[指向值] 小于 k1 小于 p2[指向值] 小于 k2……

3、所有关键字必须唯一值(这也是创建MyISAM 和innodb表必须要主键的原因),每个节点包含一个说明该节点多少个关键字,如上图第二行的i和n

4、节点:

每个节点最可以有m个子节点。

根节点若非叶子节点,至少2个子节点,最多m个子节点

每个非根,非叶子节点至少[m/2]子节点或叫子树([]表示向上取整),最多m个子节点

5、关键字:

根节点的关键字个数1~m-1

非根非叶子节点的关键字个数[m/2]-1~m-1,如m=3,则该类节点关键字个数:2-1~2

6、关键字数k和指向子节点个数指针p的关系:

k+1=p

B+tree



B+树是B-树的变体,也是一种多路搜索树:

非叶子结点的子树指针与关键字个数相同

为所有叶子结点增加一个链指针(红点标志的箭头)

MyISAM索引结构

MyISAM索引用的B+ tree来储存数据,MyISAM索引的指针指向的是键值的地址,地址存储的是数据,如下图:



结构讲解:上图3阶树,主键是Col2,Col1值就是改行数据保存的物理地址,其中红色部分是说明标注。

1、标注部分也许会迷惑,前面不是说关键字15右指针的指向键值要大于15,怎么下面还有15关键字?因为B+tree的所有叶子节点 包含所有关键字且是按照升序排列(主键索引唯一,辅助索引可以不唯一),所以等于关键字的数据值在右子树

2标注是相应关键字存储对应数据的物理地址,注意这也是之后和InnoDB索引不同的地方之一

2标注也是一个所说MyISAM表的索引和数据是分离的,索引保存在”表名.MYI”文件内,而数据保存在“表名.MYD”文件内,2标注 的物理地址就是“表名.MYD”文件内相应数据的物理地址。(InnoDB表的索引文件和数据文件在一起

辅助索引和主键索引没什么大的区别,辅助索引的索引值是可以重复的(但InnoDB辅助索引和主键索引有很明显的区别,这里 先提醒注意一下)

Innode索引结构

(1)首先有一个表,内容和主键索引结构如下两图:





结构上:由上图可以看出InnoDB的索引结构很MyISAM的有很明显的区别

1、MyISAM表的索引和数据是分开的,用指针指向数据的物理地址,而InnoDB表中索引和数据是储存在一起。看红框1可看出一行 数据都保存了。

2、还有一个上图多了三行的隐藏数据列(虚线表),这是因为MyISAM不支持事务,InnoDB处理事务在性能上并发控制上比较好, 看图中的红框2中的DB_TRX_ID是事务ID,自动增长;db_roll_ptr是回滚指针,用于事务出错时数据回滚恢复;db_row_id 是记录行号,这个值其实在主键索引中就是主键值,这里标出重复是为了容易介绍,还有的是若不是主键索引(辅助索引), db_row_id会找表中unique的列作为值,若没有unique列则系统自动创建一个。

(2)加入上表中Col1是主键(下图标错),而Col2是辅助索引,则相应的辅助索引结构图:



可以看出InnoDB辅助索引并没有保存相应的所有列数据,而是保存了主键的键值(图中1、2、3….)这样做利弊也是很明显:

在已有主键索引,避免数据冗余,同时在修改数据的时候只需修改辅助索引值。

但辅助索引查找数据事要检索两次,先找到相应的主键索引值然后在去检索主键索引找到对应的数据。这也是网上很多 mysql性能优化时提到的“主键尽可能简短”的原因,主键越长辅助索引也就越大,当然主键索引也越大。

MyISAM索引与InnoDB索引相比较

MyISAM支持全文索引(FULLTEXT)、压缩索引,InnoDB不支持

InnoDB支持事务,MyISAM不支持

MyISAM顺序储存数据,索引叶子节点保存对应数据行地址,辅助索引和主键索引相差无几;InnoDB主键节点同时保存数据行,其他辅助索引保存的是主键索引的值

MyISAM键值分离,索引载入内存(key_buffer_size),数据缓存依赖操作系统;InnoDB键值一起保存,索引与数据一起载入InnoDB缓冲池

MyISAM主键(唯一)索引按升序来存储存储,InnoDB则不一定

MyISAM索引的基数值(Cardinality,show index 命令可以看见)是精确的,InnoDB则是估计值。这里涉及到信息统计的知识,MyISAM统计信息是保存磁盘中,在alter表或Analyze table操作更新此信息,而InnoDB则是在表第一次打开的时候估计值保存在缓存区内

MyISAM处理字符串索引时用增量保存的方式,如第一个索引是‘preform’,第二个是‘preformence’,则第二个保存是‘7,ance‘,这个明显的好处是缩短索引,但是缺陷就是不支持倒序提取索引,必须顺序遍历获取索引
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: