mysql的索引介绍_1

其实数据库索引对于我们做数据检索的时候,是有很大的帮助的,提高我们的检索效率,有些同学会这么认为,

有人说建索引会提高效率,那把所有的列都建成索引就完事了吗,这个不是这样的,所以索引肯定是有自己的有缺点的,

我们先看看索引的优点有哪些


为什么要创建索引呢?

这是因为创建索引可以大大提升系统的查询性能,索引要解决最根本的问题,就是提高查询的性能,以及效率,这是他

存在的唯一的一个条件

1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性其实最后唯一性最后也会映射到查询效率上,也就是

我们在查某一行数据的时候,如果你用的条件是一个主键,他所查询的效率,就比查询非主键的效率要高,为什么呢,
   
其实我上午讲的内容已经说出来了,咱们说MYSQL当中会有自动创建聚合索引的能力,还记得吗,聚合索引聚合的是什么,
   
先找他的主键,如果有主键把主键聚合进来,如果没有主键,找唯一性约束的,可以生成一个唯一的索引键,那说明只要我
   
用主键查,就一定会走索引,那索引里面的值对外换算成什么呢,其实就是你这个数据在物理磁盘上确切的存的物理位置,
   
那我是不是可以直接去磁盘拿到这个数据,所以主键查询也是索引查询,以后你们到公司的时候,特别是新项目在设计
   
数据库的时候,DBA肯定会说这么一句话,你们在写SQL语句的时候,如果有主键作为条件的一定要用主键作为条件,

其实大家知道,但是他还是得啰嗦一句,足以证明主键和不用主键有很大的差异的

2. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因

3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方法有特别的意义,一般发现我们在建外键的时候,

外键所参照的列必须是一个主键,还记得吗,外键锁参照的列,不是外键列本身啊,是外键所参照的这个列,必须得是一个

主键,所以正是因为有这样一个约束在里面,那他在做表与表之间的连接的时候

4. 在使用分组和排序字句进行数据检索的时候,同样可以显著减少查询中分组和排序的时间,前四点都是围绕这性能,

5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能,这个优化隐藏器是什么呢,就是我们看的架构图

里面的,解析器对他进行优化,优化我们的执行计划,他肯定会缓存的,这样下回可以直接去拿这个东西了,所以这也是他的优点


所以以上5点都是为了优化性能的
也许会有人问,增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?

这个问题问的非常好,既然是这样,那我们就都建索引呗,这种想法有其合理性,然而也有片面性,虽然索引有许多优点,

但是为表中的每一个列增加索引,是非常不明智的,这是因为,增加索引,会有许多不利的方面,所以索引是把双刃剑

他并不是百分百好的,他还有自己的缺点


1. 创建索引和维护索引需要耗费时间,谁维护,首先这个索引一旦创建了,对于索引里的信息,并不是我们去维护的,

而是由数据库去维护的,那也就意味着,如果索引的信息会经常的变更,数据库就需要对索引进行维护,维护了肯定耗费

时间,这种时间随着数据量的增加而增加,或者随着索引量的增加而增加,我不知道你们有没有了解过B-TREE,Balance Tree,

你会发现Balance Tree往里面放数据可容易了,但是一旦你把某个节点删掉了,他想重新归纳这棵树的时候非常的麻烦,

麻烦不亚于把这棵树打散了再建一个新的树,那么这个过程就是维护索引,为什么这么说呢,MYQL里面对于索引的存储

结构,采用的就是Balance Tree,红黑树,明白我的意思吗,所以说他对于索引的维护是比较耗时的


2. 索引需要占用物理空间,除了数据表占用数据空间之外,每一个索引还需要占一定的物理空间,如果要建立聚簇索引

那么需要的空间更大,也就是说索引一旦建立完了,索引是存在内存当中还是存在磁盘当中,一定是存在磁盘当中的,

只要借助这个机会说一个东西,如果我的MSYQL用的是InnoDB,在我的MYSQL里存的数据是什么,data里面,这是你所有的库

咱们就找一个test这库,这三个文件看到了吗,frm这个哪来的,如果你要是没换引擎,注意看有一个叫ibd的文件,这个ibd文件

是什么呢,是做数据存储时的数据文件,你看看这些都是ibd,对于他也有一个frm,这是表结构的,两个引擎产生的文件都是一样的,

然后这里有一个ibdata1,这是什么意思啊,我们用MYSQL做主从搭建的时候,你们有没有遇到这个问题,就是MYSQL的集群搭建,

导致主库的数据不能复制到从库里,数据不同步,然后看slave的状态,这种问题是及其容易产生的,你在从库里面写了插了一条

数据,然后你在主库里又写了一条数据,其实现在主库和从库已经不匹配了,你在从库里插入一条,所以我们主从搭建的时候,

插入以主库为主,查询以从库为主,否则会有数据同步不过来,那怎么解决这个问题啊,有人说我重新装两个MYSQL,

大家注意,你首先要把从库的数据给删掉,然后取主库的配置目录下,把.log的文件,做数据迁移,把所有的.log删掉,

把ibdata删掉,这里记录的是什么呢,就是当前表的表空间的定义,也就是MYSQL的InnoDB在做数据存储的时候,

这里面放的是公用表空间,我们所关注的是什么呢,是这里面的ibd文件,通过我讲完这一节,你现在看这些文件能看懂了吧

看扩张名就懂了吧,能看懂吧,就是这个意思啊,能看懂说明目的就达到了,这就提到这里,接下来我们继续往下来
什么样的字段适合创建索引呢?

1. 索引是建立在数据库表中的某些列的上面,因此在创建索引的时候,应该仔细考虑哪些列上可以创建索引,在哪些列上

不可以创建索引

一般来说,应该在这些列上创建索引,例如:

1. 在经常需要搜索的列上,可以加快搜索的速度,就是这个列会经常当做一个查询条件,这是第一点啊

2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构,这句话什么意思呢,就是能用主键去查,就一定要

用主键去查

3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接查询,外键给他建立一个索引,其实这个问题你知道就可以,

等你未来工作你还会发现,如果你做的是一个互联网项目,其实我们表和表之间是有外键的,绝对不会建立外键约束,为什么 

不会建立外键约束,他最终是为了建分库分表,外键有这样的一个特点,我A,B分库又分表了,很有可能这两个表不在一个库里面,

外键就会报错了,外键找不到,这两个表会有外键约束的,这样就比较灵活了

4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序了,其指定的范围是连续的,这个特别有意思,MYSQL底层是

用一个B-Tree,Tree树的特点就是查询快,正是因为树的特点,那你完全可以对里面的索引进行排序了,那你对这个排序了,把这个列

建一个索引,换一个来说,因为他是有序的,起码它会少了哪个环节,把所有的数据都拿出来,树是支持排序

5. 在经常需要排序的列上创建索引,其实跟她是一个道理,还是那句话,利用树排序的道理,什么叫排序的列上,order by上

6. 在经常使用where子句中的列上创建索引,加快查询的判断条件


建立索引,一般按照select的where条件来建立,比如select的条件是where f1 and f2,那么我们如果在字段f1和字段f2上建立索引

也是没用的,只有在字段f1和字段f2同时建立索引才是有用的,这句话什么意思,两个都有索引才有提升,只建一个f1或者只建一个f2

是没用的,其实这个很好理解,他考虑f1不可能不考虑f2,我们需要记得是什么啊,就像我刚刚说的这个,都是我们需要记住的,

以便于你能更灵活的建立索引,你得知道索引的特点,这就是索引的一个特点

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/89789194