索引
索引也是一张表,表中存储着索引的字段值和该值所在的物理位置。
索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。
索引可以大大加快查询的速度,使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
在关系数据库中,索引是对数据库表中指定字段的一种存储结构。
上图中,如果现在有一条 sql 语句
select * from user where id = 40
- 如果没有索引的条件下,我们要找到这条记录,我们就需要在数据中进行全表扫描,匹配 id = 40 的数据。
- 如果有了索引,我们就可以通过索引进行快速查找,如上图中,可以先在索引中通过 id = 40 进行二分查找,再根据定位到的地址取出对应的行数据
索引的作用
索引除了快没有其他的作用,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。
如果不使用索引,MySQL必须从表中的第一条记录开始,对整张表进行遍历,直到找出相关的记录。表中记录越多,查询数据所花费的时间越多,缺乏灵活性。
如果使用了索引,数据库能快速地通过索引去查找对应条件的记录,不必遍历数据表,有效地节省查询时间。
索引设计原则
1)要注意,索引也是要占用磁盘空间的,所以并不是越多越好。
2)过多的索引会影响INSERT,DELETE,UPDATE等语句的执行效率。
3)数据过少不建议建立索引。
4)对于唯一性约束,应使用对应的唯一性索引。
5)尽量不对区分度低的字段建立索引。例如:枚举类型的性别字段只有男女,起不到优化效果。
6)建议在创建表的时候创建索引。若表中有大量记录,那么将列建为索引后,表中所有记录都将会修改。
7)不经常查询的字段,不建议创建索引。
使用流程
1.首先使用查询语句,通过索引字段查找记录。
2.数据库根据索引找到指定列的值。
3.然后通过指针找到包含该值的行。
索引的优缺点
优点
1.加快表与表之间的连接。
2.大大加快数据的查询速度。
3.所有的数据类型都可以被索引。
缺点
1.索引的创建和维护也是需要时间的,并且随着数据的增加而增加。
2.占用物理存储空间:索引需要使用物理文件存储,也会耗费一定空间。
3.创建索引和维护索引需要耗费许多时间:当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。
4.对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址;而 InnoDB 引擎的表数据文件本身就是索引文件。
MySQL使用B+ Tree作为索引的数据结构
索引类型
在一个表中,主键索引只能有一个,唯一索引可以有多个
(1)主键索引(PRIMARY KEY)
主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,针对于表中主键创建的索引;
使用primary key修饰的字段会自动创建索引;
在数据库中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型;
该索引要求主键中每个值都唯一;
数据允许重复,不允许为 NULL,一个表只能有一个列作为主键。
(2)唯一索引(UNIQUE KEY)
避免同一个表中某数据列中的值重复;
唯一索引列中的值必须是唯一的,允许为 NULL 值,一个表允许多个列创建唯一索引;
唯一索引和主键索引的区别是:唯一约束的列可以为null且可以存在多个null值。
唯一索引的用途:唯一标识数据库表中的每条记录,主要是用来防止数据重复插入,避免重复的列出现,多个列都可以标识唯一索引。
(3)普通索引(KEY/NDEX)
无关键字;
基本的索引类型,没有唯一性的限制,允许为 NULL 值。
(4)全文索引(FullText)
每个表只允许有一个全文索引;
适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息;
在 MySQL5.6 版本以前 FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引;
全文索引查找的是文本中的关键词,而不是比较索引中的值;
全文索引可以在 CHAR、VARCHAR 或 TEXT 类型的列上创建。
(5)组合索引
在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时需遵循最左前缀原则。
如果经常同时搜索两列、多列、按两列或多列排序时,组合索引也很有帮助;
例如,如果经常在同一查询中为姓和名两列设置查询条件,那么这两列上创建多列索引将很有意义。
索引结构
MySQL中常用的索引结构(索引底层的数据结构)有:B-TREE ,B+TREE ,HASH 等。