精华内容
下载资源
问答
  • MySQL深度分页

    2020-03-02 13:07:02
    原因:当黑客恶意攻击时,select * from 表 limit 1000001,3 此时会查询很多条数据,降低性能。 解决方法:select * from 表 where id>1000000 limit 3 https://www.cnblogs.com/lianshan/p/11716190.html ...

    原因:当黑客恶意攻击时,select * from 表 limit 1000001,3 此时会查询很多条数据,降低性能。

    解决方法:select * from 表 where id>1000000 limit 3

    https://www.cnblogs.com/lianshan/p/11716190.html

    https://blog.csdn.net/qq_22771739/article/details/82773205

    展开全文
  • Mysql深度分页详解

    千次阅读 2019-11-21 11:25:48
    在做查询的时候经常做分页,然后随着数据库数据量增大,页数增多(即偏移量的增加),查询速度页成指数下降 SQL:select * from student where sno>1200 and ssex='f' ORDER BY s_id ASC LIMIT 100,50 简单说...

    在做查询的时候经常做分页,然后随着数据库数据量增大,页数增多(即偏移量的增加),查询速度页成指数下降

    SQL:select  * from student  where sno>1200 and ssex='f' ORDER BY s_id ASC LIMIT 100,50

    简单说就是后面的分页参数LIMIT 100,50, LIMIT 10000,50, LIMIT 100000,50,LIMIT 1000000,50

    随着第一个参数(即偏移量的增加),查询的速度呈现指数增长趋势。

    我们如何解决这个问题啦,首先明确问题在与偏移量的增大。所以解决方案是减少偏移量。

    以下提供的解决方案都是基于存在子增长的Id,(一般在设计表的时候一定会有一个自增长的Id)

    我们知道按照Id升序排序,我们在查询上一页的时候返回Id字段,当查询下一页时我们将上一页最后那条数据的Id传递

    到后台,作为查询参数。

    我们知道上图的最大id为201368,因此在我们查询下一页的SQL语句应该这样写,将自增长Id作为一个查询参数。

    select  * from student  where s_id>201368 and sno>1200 and ssex='f' ORDER BY s_id ASC LIMIT 5

    这样可以曾几何倍数增加查询速度。

     

     

     

    展开全文
  • 随着 mysql limit 的值越来越大,查询可能会非常慢,比如: select * from demo order by a ASC, b ASC, c ASC limit 1000000, 10; 慢的真正原因,不是因为扫描了1000000 行,而在于把这1000000 万行数据重新排序...

    先说解决方案:覆盖索引+延迟关联。

    比如查询语句如下:

    select * from demo order by a ASC, b ASC, c ASC limit 1000000, 10;

    给 id 列建主键,给(a,b,c)建联合索引:

    create index idx_a_b_c on demo(a,b,c);

    然后延迟关联,即先查主键 id,然后根据 id 查其它字段:

    select a,b,c from demo,(select id from demo order by a ASC, b ASC, c ASC limit 1000000, 10) t where demo.id=t.id;

    详细原理如下:

    随着 mysql limit 的值越来越大,查询可能会非常慢,比如:

    select * from demo order by a ASC, b ASC, c ASC limit 1000000, 10;

    慢的真正原因,不是因为扫描了 1000000 行,而在于把这 1000000 万行数据重新排序。

    explain 如下:

    可以看到 Extra 是 Using filesort,表示外部排序,

    索引有两个功能:查找和排序。

    大家一般对索引的查找功能比较了解,却忽视了索引的排序功能,索引中的数据是已经排好序的,如果从索引中拿到的数据顺序跟我们需要排序的顺序是一致的,那就不要重新排序了。

    怎么解决 Using filesort 呢?答案是给(a,b,c)这三列建联合索引:

    create index idx_a_b_c on demo(a,b,c);

    创建完索引之后,索引中的数据是按 a b c 这三列排序的,就是优先按 a 排序,当 a 相同时再按 b 排序,b 也相同就按 c 排序,大致如下:

     执行 explain 现仍然是 Using filesort,原因是查询的列是*,包括了所有列,不能在索引中直接拿到最终查询数据,还需要回表查询,实现不了索引覆盖。

    延迟关联:

    延迟关联就是指先拿到主键 id,然后再根据 id 查询 select *。根据主键查找差不多能达到二分查找的速度,所以非常快。

    给 id 列创建主键,然后 select id:

    select id from demo order by a ASC, b ASC, c ASC limit 1000000, 10;

    Extra 的中 Using index 就表示“覆盖索引”,表示整个查询过程仅读取了索引中的数据而没有回表查询。

    合并在一个 sql 语句中:

    select a,b,c from demo,(select id from demo order by a ASC, b ASC, c ASC limit 1000000, 10) t where demo.id=t.id;

    mysql B+树索引:

    主键索引和辅助索引(二级索引):

     mysql 的主键索引叶字节点存的是主键所对应行的整行的全量数据,辅助索引(除主键索引以外的索引)叶字节点上存的是主键的值。

    由于前面已经给(a,b,c)三列建了联合索引,所以只要select后面的字段在 a,b,c,id这4列中,就可以直接在索引中拿到最终查询结果。由于联合索引是按(a,b,c) 这3列按优先级从高到低顺序排序的,所以 索引中的数据已经按 order by a ASC, b ASC, c ASC 排好序了,拿出来直接使用,不用再外部排序。

    (a,b,c)三列的联合索引的叶子节点上是主键的值,即id,并且当不同行的a、b、c相等时,id是有序的;即(a,b,c)的联合索引可以认为是最右侧为主键的联合索引:(a,b,c,id)。

    如果 order by 的字段不是按联合索引的列最左匹配的,比如跳过了a b 直接对 c 排序,因为索引中 c 列是无序的,所以需要外部重新排序。

    select id from demo order by c ASC limit 1000000, 10;

    查找的结果集,可以不是索引中连续的结果集(结果集为 16 17 18 25 26 27),只要最终顺序和索引中的顺序一致,也可以实现覆盖索引,不用重排序:

    对于索引的查找功能,最左匹配是指 where 条件中 and 的列;

    对于索引的排序功能,最左匹配是指 order by 中的列;

    总之,如果要用索引中现成的排序,order by 的字段必须按索引的顺序从左到右,中间不能中断(除非该列在where中指定了值,比如where a=1,则a可以不用参与排序),并且必须所有字段全升序或者全降序(叶子节点的双向链表可以正向/反向读取)。

     由于 B+树是用双向链表将所有叶子节点串起来的,所以索引的范围查找会非常快,也就是说,只要走了 覆盖索引,limit 就算扫描过了 100 万条数据,耗时也会非常短。

    100万条数据的扫描和排序,只需要 0.3 秒:

    总结:

    mysql深度分页问题的根因,不是因为扫描了大量数据,而是大量数据的重新排序太耗时,只要不重排序,就算扫描了大量数据,也不会有性能问题。

    要使 深度分页 达到最优性能,explain 的 Extra 中一定不能有 Using filesort,一定要有 Using index。

    展开全文
  • 转自:http://www.pinlue.com/article/2020/09/0917/1611219412314.html
    展开全文
  • 字节跳动面试官问我海量数据分页如何展示
  • 因为mysql默认搜索引擎是innodb,innoDb是聚簇索引,底层索引是B+tree,id为我们的主键,利用了主键索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。因为利用索引查找有优化算法,且...
  • mysql深度分页的问题

    2021-06-01 21:47:52
    今天在跟美团面试官面试的时候,面试官问了一个问题是 深度分页 什么是深度分页 假如有一张表有1千万条数据 id是主键
  • 深度分页问题是面试的高频,高级开发往上问到的概率都非常大?最容易得到的答案就是,不论where ... order by ... limit m,n 用到了哪些查询条件,都尽量让其在合适的索引或复合索引中完成;基于分表的方式解决;...
  • 深度分页Mysql

    2020-11-06 17:17:20
    https://www.cnblogs.com/quietwalk/p/6472695.html
  • 深度分页所存在的问题 我们一般做深度分页的时候, sql语句往往如下: SELECT * FROM tb_test ORDER BY id DESC LIMIT 10000, 20; LIMIT 10000 , 20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的...
  • 面试题:MySQL数据库中解决深度分页。 表格tb_test,主键id是唯一有索引的字段。表格有数据1000万,分页查询数据,每页显示10条,查询第1万页,如何编写SQL效率最高。 deep paging --索引、SQL优化 MySQL执行SQL语法...
  • 或者试下这个:mysql 深度分页, ES的话: 分页方式 性能 优点 缺点 场景 from + size 低 灵活性好,实现简单 深度分页问题 数据量比较小,能容忍深度分页问题 scroll 中 ...
  • 深度分页问题解决(mysql

    千次阅读 2019-06-27 18:15:06
    没有条件的分页查询 可以增加一个数字类型的字段,并加索引。使用这个字段的范围查询来替代分页查询 有条件的分页查询 可以通过嵌套查询,在里层实现分页功能,但是结果集只返回id。在外层再通过id来取出全量数据...
  • 大家在面试时,或者准备面试中可能会遇到上述的问题,大多的回答基本上是分库分表建索引,这是一种很标准的正确回答,但现实总是很骨感,所以面试官一般会追问你一句,现在工期不足,人员不足,该怎么实现深度分页?...
  • 深度MySQL分页查询优化方案

    千次阅读 2019-03-19 07:17:07
    MySQL是通过select * from order limit offset, N 的方式实现分页查询的。但并不是跳过offset行,而是取offset+N行,然后放弃前offset行,返回N行,当offset很小的时候,是没有问题的,当offset很大的时候,效率就...
  • 深度分页问题

    千次阅读 2019-10-31 20:37:57
    什么是深度分页? select * from table limit 1000000,10 这条语句要查询10000000条数据之后的10条数据,那么对于mysql来说肯定废了。 解决方案: 通过覆盖索引 select * from table where id > (select id ...
  • 一、分页查询优化 很多时候我们业务系统实现分页功能可能会用如下sql实现: select * from employees limit 10000,10;...这是典型的深度分页问题。 分页场景优化技巧 1、根据自增且连续的主键排序的分页查询

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,302
精华内容 2,920
关键字:

mysql深度分页

mysql 订阅