不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • MySQL

    • 01.安装MySQL
    • 02.MySQL事务
    • 03.MySQL锁
    • 04.MySQL索引 ✅
    • 05.MySQL慢查询
    • 06.MySQL优化
    • 07.binlog redolog undolog ✅
    • 08.MVCC原理 ✅
    • 09.SQL执行过程 ✅
    • 10.MySQL主从同步
    • 11.MySQL主从配置
    • 12.MySQL和Redis一致性
    • 13.MySQL查询缓存
    • 90.其他
      • 01.深度分页
    • 95.MySQL管理
    • 96.MySQL基本查询
    • 97.创建表结构
    • 98.SQL语句面试50题
    • 99.FAQ
  • Redis

  • Elasticsearch

  • Kafka

  • Etcd

  • MongoDB

  • TiDB

  • RabbitMQ

  • 数据库
  • MySQL
xiaonaiqiang
2022-10-08
目录

90.其他

# 01.深度分页

  • 在 MySQL 中,深度分页通常会带来性能问题,尤其是当偏移量(OFFSET)很大时
  • 这是因为 MySQL 在执行带有 LIMIT 和 OFFSET 的查询时,依然会从第 0 行开始逐条读取数据,直到达到指定的 OFFSET
  • 这种情况下,即使你只需要后面几条记录,前面的记录仍然会被读取并丢弃,导致查询变慢
  • 1)使用延迟关联(Deferred Join)

    • 当表有索引时,可以先通过索引查出主键 ID 的范围,再根据主键 ID 进行关联查询,避免使用大的偏移量

    • 这种方式减少了 MySQL 在大数据集上扫描的负担,尤其适用于带有索引的表

    • -- 第一步:只查出主键
      SELECT id FROM your_table ORDER BY id LIMIT 10000, 10;
      
      -- 第二步:根据主键获取完整数据
      SELECT * FROM your_table WHERE id IN (/*上一步得到的ID列表*/) ORDER BY id;
      
      1
      2
      3
      4
      5
  • 2)使用唯一索引替代 OFFSET

    • 如果表有唯一的自增 ID 或其他唯一字段,可以直接利用该索引来替代 OFFSET 进行分页

    • 可以通过 WHERE 子句过滤掉已经处理过的数据,从而避免 OFFSET 扫描

    • 这种方法通常比 LIMIT OFFSET 性能要好得多,特别是在进行深度分页时

    • SELECT * FROM your_table WHERE id > last_seen_id ORDER BY id ASC LIMIT 10;
      
      1
  • 3)合理使用覆盖索引

    • 覆盖索引是指 MySQL 可以仅通过索引查到所需数据,而无需回表(查询主表)

    • 通过确保所查询的列都在索引中,可以减少 I/O 操作,从而提高查询性能

    • SELECT id, name FROM your_table USE INDEX (idx_name) ORDER BY id LIMIT 10000, 10;
      
      1
上次更新: 2024/10/15 16:27:13
13.MySQL查询缓存
95.MySQL管理

← 13.MySQL查询缓存 95.MySQL管理→

最近更新
01
06.Mage平台
05-30
02
16.区块链交易所
05-28
03
01.常识梳理
05-28
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式