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;
  • 相关阅读:
    DataGridView在vb.net中的操作技巧
    0、(空字串)、Null、Empty、与Nothing的区别
    System.Timers.Timer与System.Windows.Forms.Timer 区别
    C#判断常见类型格式是否正确的类
    C#对系统注册表操作的类
    Socket基础知识分享
    怎样才能充分利用SQL索引
    通过建立Socket连接来快速判断数据库连接是否正确
    C#中各种数据类型转换的方法的类
    VB.Net C#代码转换工具
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5197973.html
Copyright © 2011-2022 走看看