在讲索引之前我们先讲一个小事例
小波是一个图书馆A当管理员,这个图书馆所有入馆的书直接摆在了架子上,没有任何的分类和区分,小波很高兴,因为这可以节省大量的时间,但是有一天有个读者要借《Python入门到放弃》这本书,小波花了一整天把所有的书找了一遍,累的八行。
于是乎小波跳槽到了另外一家图书馆,这家图书馆就比较厉害了,所有入馆的书都要分类,并且编号放入书架,小波一开始很不开心,这太浪费时间了,但是后来有一天有个读者要借《Python入门到放弃》,小波只用了一分钟就把书找出来了。
这个例子就在影射索引的意义。
索引定义:
1、索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
2、索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
为什么有索引:
添加索引是为了提高数据库查询性能。用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时,搜索数据就需要很长的时间,这就造成了服务器的资源浪费。为了提高检索数据的能力,数据库引入了索引机制。
索引应用场景:
什么时候适合创建索引:
1、频繁要查询的字段,经常出现在where条件后面的字段,应该创建索引。
2、更新不频繁的字段,可以创建索引。
什么时候不适合创建索引:
1、更新非常频繁的字段,不应该创建索引。
2、唯一性太差的字段,比如 gender字段,就不应该创建索引。
3、不会出现在where条件之后的字段,不应该创建索引。
常见的四种索引:
1、主键索引
注意: 主键索引一张表中只能有一个,但是可以添加多个索引 比如:唯一索引、普通索引、全文索引。
主键索引:一般在建表的时候就添加了 比如:id 一般是主键索引加自动递增。
建表后添加主键索引 :alter table table_name add primary key (column name);
主键索引的特点:不能为空且唯一。
2、普通索引
创建普通索引: alter table table_name add index 索引名(column1,column2);
3、唯一索引
创建唯一索引:ALTER TABLE `table_name` ADD UNIQUE (`column`);
唯一索引与主键索引的区别:
唯一索引:可以有多个null 但数据内容不能重复
主键索引:不能为null,且内容只能唯一。
两个区别就在于主键索引不能为null 唯一索引可以有多个null 其余都一样。
4、全文索引
全文索引只有MyISAM有效(mysql5.6之后InnoDB也支持了全文索引)[5.7不支持MyISAM]
全文索引主要针对文本文件,比如文章、标题。
索引底层实现:B+树
使用B+树原因或者说B+树的特性:
(1)单节点能存储更多数据,使得磁盘IO次数更少。
(2)叶子节点形成有序链表,便于执行范围操作。
(3)聚集索引中,叶子节点的data直接包含数据;非聚集索引中,叶子节点存储数据地址的指针。