通俗来说,索引就像一本书的目录,根据目录可以快速的定位到要找的内容的所在的页码。
MySQL官方对于索引的定义:索引(Index)是帮助MySQL高效获取数据的一种数据结构,而且是排好序的数据结构,索引存储在磁盘文件里面。
索引的两种数据结构:B+Tree索引和Hash索引(B+树平衡、排序)(Hash)
#通过Hash计算出来肯定比一个个找效率要高
#平常说的索引如果没有特别的说明,一半都是指B+Tree索引,索引能够减少存储引擎需要扫描的数据量从而提高数据的检索速度。
索引的相关:表中的数据行很多通常以某种结构保存在计算机的硬盘上,而不能全部载入内存,所以如何快速的找到我们关心的那些数据行呢?类比新华字典查汉字,我们怎么快速的查字典?怎么快速翻到图书的那一章节?
索引的作用:快速的定位我们的想要的内容在数据库中存储的位置。那么有目的的操作就会少一些,IO操作就会少一些,如果可以快速的定位数据的存储位置,就不需要一块一块的往内存调。
例如:对于
这样一个查询,如果没有建立对于性别的索引,那么数据库系统查询的时候就是进行全盘扫描。如果建立了聚簇索引,查询的效率就会提高(从执行计划里可以看出来)。
索引键值的有序性:为了快速查找,索引键值应该是有序的。
机器学习中的索引:以汉语拼音进行排序,dddddd都是d开头的。
逻辑上来讲,索引数据包含两个部分:
1.索引键值 2.对应的指针或者存储位置。
#表中的数据是没有顺序的,但是我们建立的索引需要排序,因为排好了序所以进行查询的时候就比较方便了。
索引的类型:
1.普通索引:Normal,表示普通索引大多数情况下都可以使用。
2.唯一索引:Unique,表示唯一的不允许充份股的索引,如果该字段信息不能重复,例如注册手机号用作索引的时候,可以设置为unique。(唯一值索引和唯一值约束的效果是一样的,但是他们的目的是不一样的)
Primary Key是拥有自定义的Unique约束;也就是说,主键是不允许重复的。
3.全文索引用的不多
4.空间索引:空间索引是对地理空间位置数据类型的字段建立的索引,MySQL种的地理空间位置数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。
设置索引:
可以直接对某个字段进行添加索引,可以设置索引的方式:
(字段和属性有什么区别?):字段、属性都是对列的称呼,字段是从数据库的角度的名字,而属性是从面向对象的角度的名字。属性和字段是对同一个元素的不同的称呼。在关系代数中成尸体的特性为属性,在关系模型种称实体的特性为字段。
1.
2.利用SQL语句。
(1)使用普通索引
ALTER TABLE "mybatis"."users" ADD INDEX "idx_account"("account") USING BTREE;
(2)唯一索引
ALTER TABLE "mybatis"."users" ADD UNIQUE INDEX "uniq_account"("account") USING BTREE;
聚簇索引和非聚簇索引:
1.聚簇索引:对表中的数据进行排序,需要和索引的顺序有一定的对应。在进行一些范围查询的时候是非常方便的,例如对某个学院的学生进行存放的时候,学生相邻的话查询的效率就比较高。如果建立的非聚簇索引,学生存放的比较分散,可能需要调更多的块才能访问到所有的学生。
2.非聚簇索引
单列索引和复合索引:也就是在A列,和ABC三列上建索引的区别。
那些列适合建立索引?
1.取值不允许重复的列
系统会为主键和唯一键自动创建唯一值索引。
2.更新频率要低:因为更新完表中,也需要对索引表进行更新,这样可能会导致索引表里面的顺序发生改变。
3.经常用作查询条件、连接条件或者需要排序的列。(例如学生姓名、所在院系等)例如,连接效率是比较低下的,我们可以在索引上判断是不是满足连接条件相等(等值连接)。
4.(1)在取值重复率很高的列上(2)经常作范围查询,则适合创建聚簇索引(一张表最多一个);在取值重复率较低的列上适合创建非聚簇索引。
5.复合索引中应该将使用频率高的列放在前面(例如:ABC),列就是attribute。
索引的缺点:
1.索引需要保存,也就是说需要空间消耗。
2.当表中的数据发生改变,需要对索引表进行维护。