zoukankan      html  css  js  c++  java
  • MySQL的limit分页查询的性能分析及优化

    select * from table_a limit m,n;

    LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

    为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:

    SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. 

    MySQL的 limit m,n 工作原理就是先读取符合where条件的前面m+n条记录,然后抛弃前m条,返回后面n条,所以m越大,偏移量越大,性能就越差。

    优化版本

    优化思想:避免数据量大时扫描过多的记录

    版本一、子查询的分页方式:

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

    版本二、JOIN分页方式

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

    以上优化思路的前提是表中必须存在一个字段有序且唯一

  • 相关阅读:
    常见寻找OEP脱壳的方法
    Windows内核原理系列01
    HDU 1025 Constructing Roads In JGShining's Kingdom
    HDU 1024 Max Sum Plus Plus
    HDU 1003 Max Sum
    HDU 1019 Least Common Multiple
    HDU 1018 Big Number
    HDU 1014 Uniform Generator
    HDU 1012 u Calculate e
    HDU 1005 Number Sequence
  • 原文地址:https://www.cnblogs.com/ryanzheng/p/13906307.html
Copyright © 2011-2022 走看看