从mysql读取大量数据时的实践_MySQL
程序员文章站
2022-06-04 16:50:26
...
背景
程序启动时,从mysql读取所有的数据,在内存中建立数据结构。mysql表中至少有100w条记录。以后根据时间定期从mysql增量读取数据,刷新内存结构。
表结构为{uid, product, state, modify_time,primary key(uid, product), key(modify_time)}
方法一
因为增量的更新都是按照modify_time来的,所以直观的想到根据modify_time来分页读取,每次读取1w行记录,循环100次就能全部读取100w条记录。
于是select * from table order by modify_time limit 0,10000 直到limit 990000,10000。乍一看没什么问题。但是程序启动居然超过5分钟。用explain分析一下select语句的耗时,发现limit 990000, 10000时居然耗时几秒钟,确实用到了索引modify_time,但是扫描行数超过了5万多行。omg. 对于大数据量时,同一索引下有太多的数据,越往后查找越耗时。100w后数据就已经使系统不可用了。
方法二
表结构加一个字段,id自增类型,并建立唯一索引。查询语句变成select * from table where id >=m and id 结论 从mysql查询时要避免limit m,n, 当m很大时。
推荐阅读
-
mysql从执行.sql文件时处理\n换行的问题
-
使用python的pandas库读取csv文件保存至mysql数据库
-
Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法
-
看MySQL的参数调优及数据库锁实践有这一篇足够了
-
使用wordpress的$wpdb类读mysql数据库做ajax时出现的问题该如何解决
-
Python之csv文件从MySQL数据库导入导出的方法
-
nodejs同步调用获取mysql数据时遇到的大坑
-
php从memcache读取数据再批量写入mysql的方法
-
基于 MySQL 的数据库实践(准备工作)
-
MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"