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

     一、慢查询

    假设我们有一个订单表,分页查询一条语句是这样的

    SELECT * FROM table ORDER BY id LIMIT 1000, 10; 

    但当订单表数据达到了百万级,那么这样写会慢死

    SELECT * FROM table ORDER BY id LIMIT 1000000, 10; 

    上面这条语句有可能花费几十秒.

    我们看到,随着记录的增多,limit语句的查询时间与起始记录的位置成正比增长。

    因为LIMIT 100000,10的意思扫描满足条件的100010行,扔掉前面的100000行,返回最后的10行,问题就在这里。这种分页查询方式每次都会从数据库第一条记录开始扫描,所以越往后,查询速度越慢。

    而我们解决的方法,就可以从上次已经查到的最大记录开始。

    二、使用子查询优化

    先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况:

    select * from order  limit 100000,1;
    
    select id from order limit 100000,1;
    
    select * from order where id>=(select id from orders limit 100000,1) limit 100

    3条语句的查询时间如下:

    • 第1条语句:3674ms
    • 第2条语句:1315ms
    • 第3条语句:1327ms

    针对上面的查询需要注意:

    • 比较第1条语句和第2条语句:使用 select id 代替 select * 速度增加了3倍
    • 比较第2条语句和第3条语句:速度相差几十毫秒

    接下来看下面这个查询

    select * from order where id between 1000000 and 1000100 limit 100

    查询时间:12ms

    这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。

    还有一种写法

    select * from orders_history where id >= 1000001 limit 100;

    当然还可以使用 in 的方式来进行查询,这种方式经常用在多表关联的时候进行查询,使用其他表查询的id集合,来进行查询:

    select * from order where id in
    (select order_id from goods where goodName = 'pen')
    limit 100;

    原文链接:https://www.cnblogs.com/youyoui/p/7851007.html

  • 相关阅读:
    PCA理论与实践
    深度挖掘客户价值—分析角度篇
    多元线性回归理论与实践
    数据分析框架
    Growing转化的每一步(笔记整理)
    kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)
    mysql查询优化(持续更新中)
    mysql 各种运算对于null值的处理
    left join与on,where 结合一起用的异同
    Spark(十一) -- Mllib API编程 线性回归、KMeans、协同过滤演示
  • 原文地址:https://www.cnblogs.com/qingchen521/p/8886005.html
Copyright © 2011-2022 走看看