满嘴都是糖果

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)内部数据结构使用的B+树,B树节点内部包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。

索引分类

主键索引:数据表的主键列使用的就是主键索引。一张数据表有只能有一个主键,并且主键不能为 null,不能重复。如果建表时没有指定主键,InnoDB 会自动先检查表中是否有唯一索引且不允许存在null值的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。

普通索引:又称单列索引,一个索引只能包含单个列,一张表允许创建多个普通索引;普通索引允许数据重复和NULL,作用是加快数据查询速度。

唯一索引:也是一种约束,唯一索引属性列不能出现重复数据,但允许为NULL,一张表允许闯关多个唯一索引,作用是确保数据的唯一性。

前缀索引:只适用于字符串类型数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符,较普通索引会占用更小的空间。

复合索引:一个索引包含多个列。 查询时依靠最左前缀原则,必须使用第一个字段;此外,Mysql在查询中会动态调整查询字段的顺序。

全文索引:在定义索引的列上支持值的全文查找,允许重复值和NULL,仅支持在CHAR、VARCHAR、TEXT等文本类型上使用。

除了主键索引外,其余的都成为辅助索引

聚簇索引

索引的结构和数据一起存放,也就是数据行的物理顺序与列值的逻辑顺序相同,一个表只能拥有一个聚簇索引,主键索引就属于聚簇索引。

在InnoDB中,采用B+树进行数据的存放。而 B+树只有叶子节点存放 key , data和指针,其他内节点只存放 key和指针。由于行数据和聚簇索引的叶子节点存储在一起,同一页中有多条行数据,访问同一页中不同记录时,已经把页加载到内存缓存中了,再次进行访问时无需进入磁盘。

聚集索引的优点

聚集索引的查询速度非常的快,因为整个 B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点,就相当于定位到了数据。

聚集索引的缺点

非聚簇索引

非聚集索引即索引结构和数据分开存放的索引。建立在聚簇索引之上属于非聚簇索引,比如普通索引等辅助索引。

非聚簇索引的叶子节点存储的是主键值而不是数据的物理地址。因此非聚簇索引在更新时的代价比聚簇索引小很多。

在InnoDB中,当用户进行普通索引时,将会进行两次查找,非聚簇+聚簇索引:首先查找到所需数据的主键值,之后通过主键值进行聚簇索引,查找具体的数据。

InnoDB中的顶层页目录是常驻内存的。

无法利用索引情况

MySQL 如何为表字段添加索引?

1.添加 PRIMARY KEY(主键索引)

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

2.添加 UNIQUE(唯一索引)

ALTER TABLE `table_name` ADD UNIQUE ( `column` )

3.添加 INDEX(普通索引)

ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

4.添加 FULLTEXT(全文索引)

ALTER TABLE `table_name` ADD FULLTEXT ( `column`)

5.添加多列索引

ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )