zoukankan      html  css  js  c++  java
  • mysql分页查询优化

    在实际的项目中,分页查询是在寻常不过的,甚至说不可避免的。通常数据量较少的时候,很难遇到效率的影响。但是当数据量较大时,一个普通的分页sql能让你恶心到家。

    我们常用的分页sql如下:

    1 SELECT * FROM table_name LIMIT 20 OFFSET 10;

    这个sql不会耗时很久,因为偏移量offset很小,但是当offset很大时,这个sql的执行时间完全超乎你的想象,网上有很多测试的例子,这里不再复制粘贴。另外一个因素就是我们在查询数据的时候,通常不会查询过多的页数,一般也就看几页而已,所以不会出现这样的问题。所以写这篇博客的目的不是为了解决问题,而是希望能够养成一个好习惯,分页的sql到底该怎么写。

    这里说一个额外的话,很多新人一直不理解,建表的时候为什么一定要有主键id,如果仅仅是为了非空唯一,完全可以自定义一个非空唯一的字段。mysql会为主键添加一个主键的索引,这个索引在查询数据的时候很有帮助,所以最好为你的表添加主键。这里我们也用主键来解决这个问题。

    推荐方式1:

    1 SELECT * FROM table_name t1 JOIN (SELECT id FROM table_name ORDER BY id LIMIT 10 OFFSET 200) t2 ON t1.id = t2.id

    将分页的压力通过主键的索引来解决,在子查询中完成分页条件。

    推荐方式2:

    1 SELECT * FROM table_name WHERE id >= (SELECT id FROM table_name ORDER BY id LIMIT 1 OFFSET 200) LIMIT 10

    依然是将分页的压力通过主键索引来解决,可见主键的重要性。我这里的id是bigint自增的,所以可以用>=来判断,如果是字符串,改成IN即可。不过不推荐字符串作为id,而且IN的效率也一般般,考虑方式1不错。

    这里着重说一下,为什么子查询要有order by,网上很多例子都没有的。select * from table_name limit 1返回的是数据库的第一条数据,但是select id from table_name limit 1未必返回的是第一条数据,id未必是最小的。默认的排序规则应该与查询结果有关系,这里也仅仅是猜测而已,建议limit还是与order by一起用更好一些。

    这里没有讲什么技术,只是一个小小的技巧而已,希望以后写分页的时候能够采用这两种方式,避免最原始的。良好的习惯会为你避免很多意想不到的问题!

  • 相关阅读:
    React路由基本的使用(一)
    Codeforces Round #627 (Div. 3) C
    Codeforces Round #627 (Div. 3) B
    Codeforces Round #627 (Div. 3) A
    hdu2049 不容易系列之(4)——考新郎(组合,错排)
    Codeforces Round #626 (Div. 2) E. Instant Noodles(二分图,最大公因数)
    Codeforces Round #626 (Div. 2) D. Present(位运算)
    逆元的计算方法
    Educational Codeforces Round 83 D. Count the Arrays(组合,逆元,快速幂)
    hdu4460 Friend Chains(记忆化广度优先搜索)
  • 原文地址:https://www.cnblogs.com/1ning/p/8110539.html
Copyright © 2011-2022 走看看