我记得我曾经去过一次面试,面试官问了一个有关数据库的问题。问题大致如下:
访调员:您通常写SQL吗?
我:是的,这不是必须的技巧。
访调员:然后您知道多个表数据之间存在连接。您如何检查数据?
我:加入。
访调员:使用容易吗?
我:小偷易于使用,尤其是左JON,我在盗贼身上熟练。
访调员:Emm ...,然后回去等待。
我不知道您是否遇到了此类问题,或者通常如何处理多表相关的数据,您还使用JOIN语句处理吗?
目前,我们没有直接定义加入语句的错误。让我们看一个简单的例子。
在这里,我使用MySQL数据库。由于测试要求我们创建两个表T/T2,因此该句子相对简单
使用功能创建一些测试数据。我在T桌上创建了1000万件,并在T2表中创建10,000件。
首先写下小学生的句子以进行测试:
emm ...我不知道它已经等待了多长时间,还没有结束,所以我添加了限制条件,只有10个数据
等待时间要少得多,总共19.99年代消耗了19.99s
这种速度,我觉得我可以回家种土地...
如果您想了解这么长时间消耗的原因,则必须首先了解如何实现此查询过程,然后才能得出结论可以使用加入。
首先查看执行计划
其中三个重要:
从上面的执行计划中,我们可以看到,要获取最后10个数据,我们需要扫描近1亿行数据。这个过程非常耗时和浪费。
整个过程可以理解为以下步骤:
时间复杂性:
一个对数据库有一点了解的朋友一定已经问过,为什么不将字段a添加到T2中的字段a?
如果没有问题,让我们尝试先添加索引,然后查看相同SQL所需的SQL多少。
哦,天哪,这不是一两点,现在只需要0.04来查询一次,它几乎飞起来了
看看执行计划:
目前,表T仍被完整的表扫描。不同之处在于,T2中的T2是参考,这意味着我们目前使用索引,然后查看整个执行过程:
可以发现,与上述步骤相比,只有在第三步中,在寻找驾驶表T2时才有所不同。每个步骤3均执行,只有两个搜索,即搜索索引A和主键索引,然后找到以找到主密钥索引,然后找到以找到主键索引,然后找到以找到主键索引,然后找到找到主键索引,然后找到以找到主键索引,然后找到主键的主键索引,然后在驱动器表中找到主键的主键索引。。
时间复杂性:
上面分析了两个联接过程,即索引状态和索引状态的联接过程:
该算法是一个嵌套循环,依次读取驱动程序表中的数据,并比较每次的数据,例如,在此示例中,我们的驱动器表数据(10000000)*驱动器仪表数据(10000)=时间复杂性当然,该算法将在没有数据库的情况下使用100亿次。
该算法是,当我们没有新索引时,MySQL InnoDB引擎将使用此算法。特定过程如下。时间复杂性与上述算法相同。他们都是m * n。
该算法是为了增加索引,MySQL将使用算法,并引入了特定过程。
如果我们使用索引嵌套的作业算法,它实际上不会产生太大影响,这完全满足了大多数场景的使用。
如果使用了嵌套环连接算法,则将导致大量扫描线,尤其是数以千万计甚至数亿个示例的数据的数据量,这将导致驱动器表达到扫描太多次,不建议占用大量系统资源和缓存资源。
至于一开始提到的面试官的问题,确实发生了。面试官是否想获取与表中表中的数据相关联的数据。SQL执行时,您是否仅查询单个表?实际上,这段时间的复杂性是复杂性。它不会减少,但会增加SQL执行的数量。我想知道每个人如何使用它?
在下一章中,我们必须讨论使用加入时如何优化它?在此示例中的缓存是什么以及如何优化它?以及提高查询效率的其他有效手段。