首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 千万级别分页

基础概念

MySQL 是一种关系型数据库管理系统,广泛应用于各种规模的应用程序中。当数据量达到千万级别时,分页查询成为一个常见的需求,但也是一个挑战,因为传统的 LIMITOFFSET 方法在大数据量下性能较差。

相关优势

  1. 高效查询:优化后的分页查询可以显著提高查询效率,减少数据库负载。
  2. 用户体验:快速的分页响应可以提升用户体验,特别是在数据量大的情况下。

类型

  1. 传统分页:使用 LIMITOFFSET
  2. 基于索引的分页:利用索引优化查询。
  3. 基于游标的分页:使用游标进行分页查询。

应用场景

  • 电商网站:商品列表分页。
  • 社交媒体:用户动态分页。
  • 日志系统:日志记录分页。

遇到的问题及原因

问题:传统分页在大数据量下性能差

原因

  • OFFSET 在大数据量下会导致数据库扫描大量不需要的行,效率低下。
  • 数据库需要维护大量的索引,增加了存储和维护成本。

问题:查询结果不一致

原因

  • 在高并发环境下,数据可能会发生变化,导致查询结果不一致。

解决方法

1. 基于索引的分页

通过使用索引优化查询,可以显著提高分页查询的性能。

代码语言:txt
复制
SELECT * FROM table_name
WHERE id > last_seen_id
ORDER BY id ASC
LIMIT page_size;

参考链接MySQL 分页优化

2. 基于游标的分页

使用游标进行分页查询,可以避免 OFFSET 的性能问题。

代码语言:txt
复制
SELECT * FROM table_name
WHERE id > last_seen_id
ORDER BY id ASC
LIMIT page_size;

参考链接MySQL 游标分页

3. 使用缓存

在高并发环境下,可以使用缓存来减少数据库的负载,提高查询效率。

代码语言:txt
复制
import redis
import pymysql

# 连接 Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 连接 MySQL
mysql_conn = pymysql.connect(host='localhost', user='user', password='password', db='database')
mysql_cursor = mysql_conn.cursor()

def get_page_data(page, page_size):
    cache_key = f'page_{page}_{page_size}'
    cached_data = redis_client.get(cache_key)
    if cached_data:
        return json.loads(cached_data)
    
    offset = (page - 1) * page_size
    query = f"SELECT * FROM table_name LIMIT {offset}, {page_size}"
    mysql_cursor.execute(query)
    data = mysql_cursor.fetchall()
    
    redis_client.setex(cache_key, 3600, json.dumps(data))
    return data

参考链接Redis 缓存

总结

在处理千万级别的分页查询时,传统的 LIMITOFFSET 方法性能较差。可以通过基于索引的分页、基于游标的分页以及使用缓存等方法来优化查询性能。选择合适的分页方法可以有效提高查询效率,减少数据库负载,提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL 百万级分页优化(Mysql千万级快速分页)

.);  再分享一点 查询字段一较长字符串的时候,表设计时要为该字段多加一个字段,如,存储网址的字段 查询的时候,不要直接查询字符串,效率低下,应该查诡该字串的crc32或md5 如何优化Mysql千万级快速分页...By:jack Mysql limit分页慢的解决办法(Mysql limit 优化,百万至千万条记录实现快速分页MySql 性能到底能有多高?...难道MySQL 无法突破100万的限制吗???到了100万的分页就真的到了极限??? 答案是: NO !!!! 为什么突破不了100万是因为不会设计mysql造成的。下面介绍非分表法,来个疯狂的测试!...完美解决了分页问题了。可以快速返回id就有希望优化limit , 按这样的逻辑,百万级的limit 应该在0.0x秒就可以分完。看来mysql 语句的优化和索引时非常重要的!...小小的索引+一点点的改动就使mysql 可以支持百万甚至千万级的高效分页! 通 过这里的例子,我反思了一点:对于大型系统,PHP千万不能用框架,尤其是那种连sql语句都看不到的框架!

2.4K10

MySQL 百万级分页优化(Mysql千万级快速分页)

.);  再分享一点 查询字段一较长字符串的时候,表设计时要为该字段多加一个字段,如,存储网址的字段 查询的时候,不要直接查询字符串,效率低下,应该查诡该字串的crc32或md5 如何优化Mysql千万级快速分页...By:jack Mysql limit分页慢的解决办法(Mysql limit 优化,百万至千万条记录实现快速分页MySql 性能到底能有多高?...难道MySQL 无法突破100万的限制吗???到了100万的分页就真的到了极限??? 答案是: NO !!!! 为什么突破不了100万是因为不会设计mysql造成的。下面介绍非分表法,来个疯狂的测试!...完美解决了分页问题了。可以快速返回id就有希望优化limit , 按这样的逻辑,百万级的limit 应该在0.0x秒就可以分完。看来mysql 语句的优化和索引时非常重要的!...小小的索引+一点点的改动就使mysql 可以支持百万甚至千万级的高效分页! 通 过这里的例子,我反思了一点:对于大型系统,PHP千万不能用框架,尤其是那种连sql语句都看不到的框架!

3.7K30
  • 千万级别的表分页查询非常慢,怎么办?

    下面我以某个电商系统的客户表为例,数据库是 Mysql,数据体量在 100 万以上,详细介绍分页查询下,不同阶段的查询效率情况(订单表的情况也是类似的,只不过它的数据体量比客户表更大)。...对于千万级的单表数据查询,小编我刚刚也使用了一下分页查询,起点位置在 10000000,也截图给大家看看,查询耗时结果:39 秒!...实际的操作思路就是先通过分页查询满足条件的主键 ID,然后通过主键 ID 查询部分数据,可以显著提升查询效果。...-- 先分页查询满足条件的主键IDselect id from bizuser order by id limit 100000,10;-- 再通过分页查询返回的ID,批量查询数据select * from...本文主要围绕大表分页查询性能问题,以及对应的解决方案做了简单的介绍,如果有异议的地方,欢迎网友留言,一起讨论学习!

    5.6K30

    mysql千万分页查询SQL优化

    (优化前页面需要转 1 分钟才可显示出数据,页面转圈圈~) 这个功能对应的是后台的一个千万级别的大表,未分库分表,目前的数据量为13755695,分页查询使用到了limit,优化之前的查询耗时30 s,...按照下文的方式调整SQL后,耗时800 ms; 关于分页的优化 使用limit分页时的MySQL并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行,那当offset...而 count 函数又是必不可少的,因为需要查询总数,以供分页显示总条数及最后一页,所以必须从 count 优化入手 2、 如果技术上优化遇到了瓶颈,或者说 mysql 已经优化到极致,那么能否从业务上解决...继续观察 mysql 索引情况,由于现有索引的 key_len 过大,可以通过建立较小的索引 (使用小字段) 来为排序使用,由于我们的业务查询必有时间段条件,固为时间段字段单独建立索引,由此带来了几秒的性能提升...此种优化最终实现:列表数据加载 40 秒 其他优化思路 通过学习研究发现,mysql innodb 引擎在有索引、有 where 条件的情况下,count 速度并不慢,所以问题一样还出在

    1.3K20

    MySQL千万级别大表,你要如何优化?

    MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下...而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED...查询时要尽可能将操作移至等号右边 sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库 不用`SELECT *`` OR改写成IN:OR的效率是n级别...,IN的效率是log(n)级别,in的个数建议控制在200以内 不用函数和触发器,在应用程序实现 避免%xxx式查询 少用JOIN 使用同类型进行比较,比如用'123'和'123'比,123和123比...否则将引擎放弃使用索引而进行全表扫描 对于连续数值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5 列表数据不要拿全表,要使用LIMIT来分页

    1.2K10

    MySQL-字节千万级数据分页查询优化方案

    一、MySQL分页查询优化(基于limit offset,size) 1、表结构: create table `test`( `id` int(11), `className` varchar...NOT NULL comment `学生姓名`, primary KEY (`id`), KEY idx_className(`className`) USING BTREE ) 插入一千万条数据到表中...2、直接查询 直接分页查询耗时70s: select * from test where class_name = "班级一" limit 900000,10; 看mysql执行计划,的确用到了索引,但是查询耗时长达...一般分页查询有两种做法: 1、先查询出90万+10条记录的id,回表查询数据,再将90万+10条完整记录发给MySQL以便筛选最后10条; 2、先查询出90万+10条记录的id,筛选出最后10条记录的id...再回表查询,最后返回10条完整记录给MySQL

    29410

    MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码

    笔者最近工作中遇见一个性能瓶颈问题,MySQL表,每天大概新增776万条记录,存储周期为7天,超过7天的数据需要在新增记录前老化。...key_buffer_size mysqlcur.execute("SET GLOBAL key_buffer_size = 536870912") key_buffer_size是global变量,详情参见Mysql...官方文档: https://dev.mysql.com/doc/refman/5.7/en/server-configuration.html DELETE QUICK + OPTIMIZE TABLE...直接的delete后,mysql会合并索引块,涉及大量内存的拷贝移动;而OPTIMIZE TABLE直接重建索引,即直接把数据块情况,再重新搞一份(联想JVM垃圾回收算法)。.../doc/refman/5.7/en/alter-table-partition-operations.html 具体分区说明 2)http://mysql.rjweb.org/doc.php/deletebig

    7.3K21

    mysql设置隔离级别_修改mysql事务隔离级别

    引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:“讲讲mysql有几个事务隔离级别?” 你:“读未提交,读已提交,可重复读,串行化四个!...默认是可重复读” 面试官:“为什么mysql选可重复读作为默认的隔离级别?” (你面露苦色,不知如何回答!) 面试官:”你们项目中选了哪个隔离级别?为什么?” 你:“当然是默认的可重复读,至于原因。。...Mysql默认的事务隔离级别是可重复读(Repeatable Read),那互联网项目中Mysql也是用默认隔离级别,不做修改么?...而这种格式在读已提交(Read Commited)这个隔离级别下主从复制是有bug的,因此Mysql将可重复读(Repeatable Read)作为默认的隔离级别!...奈何这个格式在mysql5.1版本开始才引入。因此由于历史原因,mysql将默认的隔离级别设为可重复读(Repeatable Read),保证主从复制不出问题!

    2.7K10

    MySQL隔离级别

    MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(read-committed) 否 是 是 可重复读(repeatable-read...) 否 否 是 串行化(serializable) 否 否 否 mysql默认的事务隔离级别为repeatable-read ?...但是在应用程序中,我们得代码可能会把18700提交给用户了,如果你一定要避免这情况小概率状况的发生,那么就要采取下面要介绍的事务隔离级别“串行化” mysql> select sum(balance)...中事务隔离级别为serializable时会锁表,因此不会出现幻读的情况,这种隔离级别并发性极低,开发中很少会用到。...中默认事务隔离级别是可重复读时并不会锁住读取到的行 事务隔离级别为读提交时,写数据只会锁住相应的行 事务隔离级别为可重复读时,如果有索引(包括主键索引)的时候,以索引列为条件更新数据,会存在间隙锁间隙锁

    1.9K10

    MySQL事务隔离级别

    MySQL的四种隔离级别 读未提交 读提交 可重复读 串行化 隔离级别可以通过MySQL的视图来实现。...读未提交隔离级别下,其他事务进行查询时,直接返回记录上的最新值,没有视图概念。 读提交 一个事务修改了数据且成功提交事务后,才可查询到更新后的数据。读提交隔离是开始执行SQL语句时创建视图。...不同数据库默认隔离级别 不同事务隔离级别下数据库的行为不同。...Oracle数据库的默认隔离级别是“读提交” MySQL的默认隔离级别是“可重复读” 注意:数据库由Oracle迁移至MySQL时需要设置默认隔离级别为读提交。...不同事务隔离级别对脏读、不可重复读、幻读的影响 此图片引用自网络

    1.4K30

    mysql(2) - 隔离级别

    不同隔离级别,对应读取问题 脏读 不可重复度 幻读 读未提交 × × × 读已提交 √ × × 可重复读 √ √ ×(mysql innoDB 在加间隙锁的情况下是√) 序列化 √ √ √ 幻读有2...在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会访问版本链中的记录的过程。...举个例子 ,在已提交读隔离级别下: 比如此时有一个事务id为100的事务,修改了name,使得的name等于小明2,但是事务还没提交。...也就是说已提交读隔离级别下的事务在每次查询的开始都会生成一个独立的ReadView,而可重复读隔离级别则在第一次读的时候生成一个ReadView,之后的读都复用之前的ReadView。...这就是Mysql的MVCC,通过版本链,实现多版本,可并发读-写,写-读。通过ReadView生成策略的不同实现不同的隔离级别

    96110
    领券