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

    引自:https://www.cnblogs.com/geningchao/p/6649907.html

    索引是什么:https://www.cnblogs.com/chenshishuo/p/5030029.html

    MySQL的分页查询方法:

    方法1: 直接使用数据库提供的SQL语句
    ---语句样式: MySQL中,可用如下方法: SELECT * FROM table_name LIMIT M,N
    ---适应场景: 适用于数据量较少的情况(元组百/千级)
    ---原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3).Limit限制的是从结果集的M位置处取出N条输出,其余抛弃.(细究起来并不是完全意义上的分页,只是设定一个位置M,取后面N条数据,并不存在页这个概念)

    方法2: 建立主键或唯一索引, 利用索引(假设每页10条)

    主键索引是跟随表的建立而存在的,所以以下讲的索引都是主键索引,不需要再进行新建操作了。
    ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M
    ---适应场景: 适用于数据量多的情况(元组数上万)
    ---原因: 索引扫描,速度会很快. 有朋友提出: 因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3

    方法3: 基于索引再排序
    ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M
    ---适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)
    ---原因: 索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待...).

    方法4: 基于索引使用prepare(第一个问号表示pageNum,第二个?表示每页元组数)
    ---语句样式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT * FROM 表名称 WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT M
    ---适应场景: 大数据
    ---原因: 索引扫描,速度会很快. prepare语句又比一般的查询语句快一点。

    方法5: 利用MySQL支持ORDER操作可以利用索引快速定位部分元组,避免全表扫描

    比如: 读第1000到1019行元组(pk是主键/唯一键).

    SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20

    方法6: 利用"子查询/连接+索引"快速定位元组的位置,然后再读取元组. 道理同方法5。如(id是主键/唯一键,蓝色字体时变量):

    利用子查询示例:

    就是使用子查询返回一个标量值,这个值就是主键上的偏移量。

    SELECT * FROM your_table WHERE id <= 

    (SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize) ORDER BY id desc LIMIT $pagesize

    利用连接示例(与子查询类似):

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

    覆盖索引

    什么是覆盖索引呢?

    SELECT id_ky FROM table_name LIMIT 866613, 10; (唯一的查询的数据id_ky就是主键,主键就是索引,MySQL就会按照这个索引快速查询)

    那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:

    SELECT * FROM product WHERE id_ky > =(select id_ky from product limit 866613, 1) limit 20
    查询时间为0.2秒!

    另一种写法
    SELECT * FROM product a JOIN (select id_ky from product limit 866613, 20) b ON a.id_ky = b.id_ky
    查询时间也很短!

     
  • 相关阅读:
    <C++ QT4 GUI 编程>第一章笔记
    生成snmp++动态库
    PHP 5.3 新特性
    编译安装-Subversion 1.8.5
    Xen入门系列四【Xen 管理实操】
    Xen入门系列三【Xen 管理工具 xm】
    COMET探索系列三【异步通知服务器关闭数据连接实现思路】
    PHP生成二维码【谷歌API+qrcode+圆角Logo】
    SSH免密码登陆详解
    COMET探索系列二【Ajax轮询复用模型】
  • 原文地址:https://www.cnblogs.com/xuhaojun/p/9108747.html
Copyright © 2011-2022 走看看