十三、MySQL数据库之索引B_索引的实战

接着上一个课程,我们继续将下去,顺便最后我们实战一下。如果没有看上一讲的话,请点击这里:索引A_索引介绍,创建、删除索引

上一节我们讲述了索引是干啥的,索引怎么去创建,怎么删除,这一节我们来讲述上一节留下的疑问。

问题1:索引的好处与坏处

索引的好处,其实我们最开始讲述了,就是这个布告栏啊。它可以让我们不去扫描表,就秒一下布告栏,然后直接去找人就好。但是啊,坏处就有很多了。

1. 占空间。我们知道啊,这个布告栏也是占用小区的一块地,而且这个还是动态扩张的,并不是一成不变的。好比现在表里面有100条数据,索引相对也有100条,但是你现在又插入100条,那你说索引不也得跟这变吗,不然我们到时候怎么去用它。

2. 创建了错误的索引,可能会导致检索速度减少。再举例啊,我们现在按照姓名和性别去进行创建索引,姓名在前,性别在后。如果我们是按照姓名去找小区里面的人,那么我们很方便,因为就算同名同姓的也最多就几户,我们多跑几家也是可以的。但是如果说性别排在前,姓名排在后,我们就需要全部的索引都看一遍,因为我们不知道这个性别的人具体叫啥,所以都得看,这就导致了一个全索引扫描的问题。

3. 离散度问题。再比如说,我们现在要找一个姓张的、女的、漂亮的人,然后现在给的一个索引是第一个漂亮,第二个性别,第三个姓氏。如果按照这个我们去找,首先就得全索引扫描,找到女的,然后是长相,很明显,也得全部扫描,最后才是姓氏。这样的索引如果让我们去用,还不如不去使用,直接全表检索得了。

如何去解决这个问题呢?我们这样去做,我们让姓氏在前,性别第二,漂亮第三。因为啊,姓氏可以过滤掉很多很多的人,因为不可能所有的人都姓张,而且姓氏种类又多,离散度相对来说好,再然后就是用性别再去筛选,这样我们数据量又会下去一半,最后漂亮我们全部扫描,因为小姐姐们都很漂亮哦~这样我们最后到手的数据和上面的虽然一样,但是,我们总的IO开销是低于上面很多很多。

问题2:索引顺序错误

这个我们其实上面说了,索引的顺序错误会导致我们检索的数量不降低,反而增加。更坏的就是索引创建了,但是数据库在检索数据的时候没有用到,这不能说数据库傻,而是你创建的索引没有用。

 

当然啊,上面说的这些都是纸上谈兵,我们来点实际的。我个人就是专门做Oracle优化的,平时会积累一些文档啊啥的,这里我就给大家说一下,我平时碰到的一些问题,我们用实际说话。

例1

十三、MySQL数据库之索引B_索引的实战

大家可以看这个SQL,很明显,这就是一个普通的连接查询,然后给定了一些条件,我们来运行一下,看看执行计划。

十三、MySQL数据库之索引B_索引的实战

可能大家有的看不太懂,我给大家圈起来了,首先是ACCESS FULL,这个是指全表检索,也就是两个表都是全表检索了一次。

然后我们看标题 A-Rows,下面有好多个数据量,我们可以看到,最后一个是 7594K,也就是 7594 * 1000 条数据,700多万的数据,花费的时间是1.05秒,扫描了197K的数据块。(这里和大家说一下,人家这个Oracle数据库是1T的内存,其他硬件更是杠杠的,所以说才消耗1秒多,正常服务器可能在10几秒或者是更长)

从这里我们可以看到啊,我们花费了1秒多的时间扫描了700多万的数据,这个数据量虽然说不是很大,但是这个IO确实有点高,然后我们开始优化。通过创建索引。

十三、MySQL数据库之索引B_索引的实战

通过创建两个索引,然后我们再来看一下执行计划。

十三、MySQL数据库之索引B_索引的实战

是不是,我们总耗时花费0.01秒,IO开销才是2622块,和上面19万块相比,少的太多了,时间也从4秒下降到了0.01秒,这个就是索引的力量。

 

算了,就弄一个例子得了,还有正事没说呢。

索引的实战

我昨天的博客中让大家准备表,希望大家都准备了,如果不会啊,联系我QQ,2100363119,我发给你,主要博客太小了,没地方扔。我们先来查询一下这个表。

十三、MySQL数据库之索引B_索引的实战

可以看到啊,这个表有52093条数据,主要是是在太困了,本来说弄10万条数据,算了,弄上一半得了。

然后我们来查询一下所有的数据

十三、MySQL数据库之索引B_索引的实战

大概需要0.114秒左右。然后我们给定条件,我们查询一下org = 广东的所有数据。

十三、MySQL数据库之索引B_索引的实战

我们可以看到啊,大概是0.092秒,我们再给一个条件,查询price > 20的。

十三、MySQL数据库之索引B_索引的实战

很好,然后我们可以看到也得需要0.068秒,现在,我们来创建一个索引。

十三、MySQL数据库之索引B_索引的实战

可以看到啊,我们创建好了,然后我们再来运行一下上面的SQL。

十三、MySQL数据库之索引B_索引的实战

可以看到啊,快了一些,但是不是那么明显,我来和大家说一下为啥。

这里虽然速度提高了,但是,扫描的数据块其实并没有提高多少,从最后的总数据量我们可以看到啊,扫描了近2万的数据,其实也提高不了多少,因为这两个条件,真正做到筛选的只有这个org,后面的price并没有帮上多少事情。但是啊,我们可以这样去操作一下。先将索引删除掉。

十三、MySQL数据库之索引B_索引的实战

然后我们将 > 修改成 = 。我们再来运行一下。

十三、MySQL数据库之索引B_索引的实战

在没有索引的情况下,我们使用了0.043秒,然后我们将刚刚删除的索引再给他创建回去。再来运行

十三、MySQL数据库之索引B_索引的实战

是不是,一下子就发现速度提高了。

 

到这里索引就学习完了,大家要好好练习一下,最好能购买一些书籍一边看一边练习。(最好是能买到mysql8.0的数据)

有问题大家联系我QQ:2100363119,感谢大家。