MySQL百万数据深度分页优化思路分析

yizhihongxing

业务场景

一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万、千万条数据只是时间问题。

瓶颈再现

创建了一张user表,给create_time字段添加了索引。并在该表中添加了100w条数据。

MySQL百万数据深度分页优化思路分析

我们这里使用limit分页的方式查询下前5条数据和后5条数据在查询时间上有什么区别。

查询前10条基本上不消耗什么时间
MySQL百万数据深度分页优化思路分析

我们从第50w+开始取数据的时候,查询耗时1秒。
MySQL百万数据深度分页优化思路分析

SQL_NO_CACHE

这个关键词是为了不让SQL查询走缓存。

同样的SQL语句,不同的分页条件,两者的性能差距如此之大,那么随着数据量的增长,往后页的查询所耗时间按理会越来越大。

问题分析

回表

我们一般对于查询频率比较高的字段会建立索引。索引会提高我们的查询效率。我们上面的语句使用了SELECT * FROM user,但是我们并不是所有的字段都建立了索引。当从索引文件中查询到符合条件的数据后,还需要从数据文件中查询到没有建立索引的字段。那么这个过程称之为回表

覆盖索引

如果查询的字段正好创建了索引了,比如 SELECT create_time FROM user,我们查询的字段是我们创建的索引,那么这个时候就不需要再去数据文件里面查询,也就不需要回表。这种情况我们称之为覆盖索引

IO

回表操作通常是IO操作,因为需要根据索引查找到数据行后,再根据数据行的主键或唯一索引去聚簇索引中查找具体的数据行。聚簇索引一般是存储在磁盘上的数据文件,因此在执行回表操作时需要从磁盘读取数据,而磁盘IO是相对较慢的操作。

LIMTI 2000,10 ?

你有木有想过LIMIT 2000,10会不会扫描1-2000行,你之前有没有跟我一样,觉得数据是直接从2000行开始取的,前面的根本没扫描或者不回表。其实这样的写法,一个完整的流程是查询数据,如果不能覆盖索引,那么也是要回表查询数据的。

现在你知道为什么越到后面查询越慢了吧!

问题总结

我们现在知道了LIMIT 遇到后面查询的性能越差,性能差的原因是因为要回表,既然已经找到了问题那么我们只需要减少回表的次数就可以提升查询性能了。

解决方案

既然覆盖索引可以防止数据回表,那么我们可以先查出来主键id(主键索引),然后将查出来的数据作为临时表然后 JOIN 原表就可以了,这样只需要对查询出来的5条结果进行数据回表,大幅减少了IO操作。

优化前后性能对比

我们看下执行效果:

  • 优化前:1.4s
    MySQL百万数据深度分页优化思路分析

  • 优化后:0.2s
    MySQL百万数据深度分页优化思路分析

查询耗时性能大幅提升。这样如果分页数据很大的话,也不会像普通的limit查询那样慢。

原文链接:https://www.cnblogs.com/bingfengdada/p/17384958.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL百万数据深度分页优化思路分析 - Python技术站

(0)
上一篇 2023年5月8日
下一篇 2023年5月9日

相关文章

  • MySQL中如何优化order by语句

    当查询语句中包含了ORDER BY时,MySQL在查询结果之前会先做一个排序操作,这个操作需要消耗大量的资源,如果排序操作的效率不高,则整个查询的效率也会受到影响。因此,对于MySQL中的ORDER BY语句,进行优化是非常重要的。 以下是优化MySQL中ORDER BY语句的攻略: 1. 索引优化 ORDER BY语句可以使用索引进行优化,如果查询的字段已…

    MySQL 2023年5月19日
    00
  • MySQL选错索引的原因以及解决方案

    下面是详细的攻略: MySQL选错索引的原因 选错索引在MySQL中是一个常见的问题,通常会导致查询性能下降甚至出现全表扫描的情况。下面是一些可能导致选错索引的原因: 非常规查询模式:当查询表的方式不是传统方式,如在WHERE语句中使用函数或表达式时,可能会导致MySQL无法使用最优索引,从而选择了错误的索引。 不同的查询条件:在不同的查询条件下,选择不同的…

    MySQL 2023年5月18日
    00
  • MySQL数据库中delimiter的作用概述

    以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获。 其实就是告诉MySQL解释器,该段命令是否已经结束了,MySQL数据库是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,…

    MySQL 2023年4月13日
    00
  • mysql “too many connections” 错误 之 mysql解决方法

    当MySQL达到最大连接数时,该错误会出现:Too many connections。这是因为MySQL已经不能继续接受新连接,直到旧的连接被释放或被重置后才能恢复。在此文中,我将针对该错误提供一些解决方法。 查看并提升MySQL最大连接数限制 首先,确定MySQL的最大连接数限制。使用以下命令可以查看当前值: show variables like ‘ma…

    MySQL 2023年5月18日
    00
  • MySQL开启Slow慢查询的方法示例

    下面是针对MySQL开启Slow慢查询的方法示例的完整攻略。 什么是慢查询 慢查询指的是在执行MySQL查询操作时,耗费的时间超过了预期的时间,通常时间超过一定阈值才会被视作慢查询。在实际情况中,慢查询往往是导致MySQL数据库性能下降的主要原因之一。因此,开启MySQL慢查询功能,及时监测并优化慢查询语句,可以大大提升MySQL数据库的性能。 如何开启My…

    MySQL 2023年5月19日
    00
  • 一文带你了解MySQL四大类日志

    一下是“一文带你了解MySQL四大类日志”的完整攻略: 一文带你了解MySQL四大类日志 MySQL作为目前最流行的开源关系型数据库之一,拥有着丰富的特性和强大的功能。在它的运行过程中,MySQL会产生各种类型的日志,用于记录MySQL的运行状况和异常情况。MySQL日志主要可分为四大类:二进制日志、错误日志、查询日志和慢查询日志。 二进制日志 二进制日志(…

    MySQL 2023年5月18日
    00
  • MySQL针对Discuz论坛程序的基本优化教程

    MySQL针对Discuz论坛程序的基本优化教程 简介 本文将介绍如何通过对MySQL数据库进行调优来优化Discuz论坛程序性能的方法。 基本优化 调整MySQL缓存配置 在MySQL中,缓存是提高性能的一个关键。通过调整MySQL缓存配置参数,可以提高Discuz论坛程序的响应速度。 示例1: 可以通过调整以下参数来优化MySQL缓存: innodb_b…

    MySQL 2023年5月19日
    00
  • MySQL 数据类型选择原则

    MySQL 数据类型选择是数据库设计中非常重要的一步。在选择数据类型的时候,我们需要根据具体的业务需求来选择。以下是几个选择MySQL数据类型的原则: 1. 尽量使用MySQL内置类型 MySQL提供了很多内置类型,这些类型已经经过优化,使用效率较高,而且保证数据的正确性和一致性。例如:INT, VARCHAR, DECIMAL, DATE和TIME等。 2…

    MySQL 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部