暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的分页查询语句的性能分析

IT民工2020 2021-06-07
352

     MySql分页sql语句,如果和MSSQL的TOP语法相比,那么MySQL的LIMIT语法要显得优雅了许多。使用它来分页是再自然不过的事情了。

2.1最基本的分页方式:

    SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
    SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...

    在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引:

    举例来说,如果实际SQL类似下面语句,那么在category_id, id两列上建立复合索引比较好:

      SELECT * FROM articles WHERE category_id = 123 
      ORDER BY id LIMIT 50, 10

      2.2子查询的分页方式:

      随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似:

        SELECT * FROM articles WHERE category_id = 123 
        ORDER BY id LIMIT 10000, 10


        一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。

        此时,我们可以通过子查询的方式来提高分页效率,大致如下:

          SELECT * FROM articles WHERE  id >=   
          (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10

          2.3JOIN分页方式

            SELECT * FROM `content` AS t1    
            JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2
            WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;


                经过测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。

            explain SQL语句:

            id select_type table type possible_keys key key_len ref rows Extra

            1 PRIMARY <derived2> system NULL NULL NULL NULL 1  

            1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where

            2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index

            为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。

            实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。

            为您推荐

            ☞ SQL 基础知识梳理-插入数据

             SQL 基础知识梳理-删除数据

            ☞ SQL 基础知识梳理-更新数据

            ☞ SQL 基础知识梳理-事务

            ☞ SQL 基础知识梳理:主键(PK)和外键(FK)

            ☞ C# 将字符转换为双精度浮点型

            ☞ C# 常用时间日期处理类

            ☞ C# 日期操作



            如果您觉得好看,请点个“在看”↓↓↓

            文章转载自IT民工2020,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论