在MySQL中,我们通常使用限制来完成页面上的分页函数,但是当数据量达到较大值时,接口响应速度的越慢,接口就慢了。
本文主要讨论限制缓慢转移的原因和优化方案。为了模拟这种情况,以下内容介绍了表结构和执行SQL。
用户表的结构相对简单。为了使SQL的执行时间更加明显,有9个姓氏。
这里建立了一个存储过程以填写数据。总共建立了90,000个数据。执行功能后,执行SQL以修改性别字段。
PS:此功能长时间执行,我运行617.284秒。
从用户中选择 *性别= 1限制100、10;好的,时间:0.005000sselect *来自用户,性别= 1限制1000、10;好的,时间:0.007000sselect *从用户中的性别;好的,时间:33.465000可以看到限制的偏移越大,执行时间越长。
首先,让我们分析此SQL执行的过程,例如以上表中的第一行。
由于性别列是索引列,因此MySQL将采用性指数树并点击性别= 1。
然后由于ID的主要密钥索引是集群索引,因此性字段上的索引是非集群索引,它是主密钥ID的值,并且查询语句需要所有列。性指数树的中值值,叶节点上的值是主要密钥ID的值,以查询主要键契据树上其他列(名称,性别)的值,最后返回结果浓度这样,第一行数据是成功的。
最后的SQL要求,即查询101至110个数据,但是MySQL将查询前110行,然后放弃前100行。最终结果仅留下101至110行,执行结束。
同样,在上述执行过程中,限制偏移时间长时间的原因是:
基于上述两个原因,MySQL在返回表上花费了大量时间,并且表格的结果不会出现在集中度中,这会导致越来越长的查询。
由于无效的退货表是慢速查询的主要原因,因此优化方案主要始于减少返回数量。假设我们首先将A+1的ID到A+B数据,然后返回后面以返回返回返回数据的其他数据列,则降低了A -Time表,并且速度肯定会很大快点。
这涉及覆盖索引。SO值的覆盖范围索引是可以从非媒体群集索引中找到的所需数据,而不是通过返回表从主密钥索引从主密钥索引查询其他列,这可以显着提高性能。
基于此想法,优化计划是首先查询主密钥ID,然后根据主密钥ID查询其他列的其他列。优化的SQL和执行时间如下。
从用户中选择 * JOIN(从用户中选择ID,其中性别= 1限制100,10)b a.id = b.id;好的,时间:0.000000sselect *从用户a JOIN(从用户中选择ID,sex = 1 limit 1000,10)b on a.id = b.id;好的,时间:0.00000SSELECT *从用户a JOIN(从用户中选择ID = 1 limit = 1 limit 10000,10)b a.id = b.id;好的,时间:0.002000SSELECT *从用户a JOIN a JOIN(从性别= 1限制100000,10)b on a.id = b.id;好的,时间:0.015000sselect *从用户a joinuser,性别= 1限制1000000,10)b on a.id = b.id;好的,时间:0.151000sselect *从UTER A JOIN(从用户中选择sex sex 10000000,10)b a.id = b.id;好的,时间:1.161000,确实得到了显着改进。
当然,有一种基于条件过滤的分类方法有缺陷的方法。
例如,像上面的示例用户表一样,我想使用限制分页来获得100,0001至100,000个数据。您可以写SQL:
但是以这种方式进行优化是有条件的:主要密钥ID必须是有序的。在有序条件下,也可以使用其他字段(例如创建时间)代替主密钥ID,但前提是建立了此字段。
简而言之,有许多限制可以通过使用条件过滤来优化极限。通常,建议使用覆盖索引的方法进行优化。
它主要分析了限制分页缓慢位移的原因。同时,它还提出了响应优化解决方案。建议使用覆盖索引的方法来优化限制页面的长时间执行的问题。
希望帮助所有人。