zoukankan      html  css  js  c++  java
  • 【MySQL】过滤后的结果集较大,用LIMIT查询分页记录,查询效率不理想

    > 参考的优秀文章

    优化LIMIT分页--《高性能MySQL》(电子工业出版社)

    > 场景描述

    遇到一个场景:查询排序后的结果集较大,我们采用分页显示,每页显示20条记录,但是查询效率还是不尽理想。

    结果,采用以下两个手段优化效率:

    1、对排序的字段加上索引(普通索引,即BTREE),加了索引后,普通查询的效率加快了,但偏移量大的数据(比如排序靠后的数据)查询还是较慢。

    2、借鉴《高性能MySQL》的手段,减少扫描范围、延迟关联,偏移量大的数据查询效率也得到优化。

    > 简单的实验

    版本说明:

    -- 5.6.19
    select version();

    实验条数:

    -- 大概171751条记录
    select count(1) from t_user t;

    没有索引情况下:

    -- 无索引下,排序查询TOP20记录,需时约0.502秒
    select * from t_user t order by t.`create_time` desc limit 20;
    
    -- 无索引下,排序查询第15000+记录,需时约2.485秒
    select * from t_user t order by t.`create_time` desc limit 150000, 20;

    添加索引后:

    -- 添加索引后,排序查询TOP20记录,需时约0.003秒
    select * from t_user t order by t.`create_time` desc limit 20;
    
    -- 添加索引后,排序查询第15000+记录,需时约1.838秒
    select * from t_user t order by t.`create_time` desc limit 150000, 20;

    添加索引、减少扫描范围、延迟关联后:

    -- 添加索引后,排序查询TOP20记录,需时约0.004秒
    select t.* from t_user t inner join 
    (
    select t.`id` from t_user t order by t.`create_time` desc limit 20
    ) order_result on t.id = order_result.id
    order by t.`create_time` desc;
    
    -- 添加索引后,排序查询第15000+记录,需时约0.491秒
    select t.* from t_user t inner join 
    (
    select t.`id` from t_user t order by t.`create_time` desc limit 150000, 20
    ) order_result on t.id = order_result.id
    order by t.`create_time` desc;
  • 相关阅读:
    异常空格处理
    django
    django的ORM理解
    Django前后端分离
    Django企业项目实战
    Centos7 从 git version 1.8.3.1升级git version 2.32.0 全过程
    代码 80070005 Windows Uudate 遇到未知错误
    Power Shell Active Directory 批量创建分组
    H3C S5024E-PWR-X 端口镜像及抓包实例
    FusionCompute 忘记密码 重置操作
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5197973.html
Copyright © 2011-2022 走看看