当前位置:网站首页>MySql千万级分页优化,快速插入千万数据方法
MySql千万级分页优化,快速插入千万数据方法
2022-08-02 09:40:00 【夜の雨】
为便于测试 新建表格 插入两千万条测试数据
Mysql版本:5.7.34
1. 快速插入千万数据
--创建MyISAM模式表方便批量跑数据(模拟实际用表多字段)
CREATE TABLE `my_tables` (
`id` bigint(32) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`age` int(32) DEFAULT NULL,
`time` varchar(32) DEFAULT NULL,
`pwd` varchar(32) DEFAULT NULL,
`test` varchar(255) DEFAULT NULL,
`test2` varchar(255) DEFAULT NULL,
`test3` varchar(255) DEFAULT NULL,
`test4` varchar(255) DEFAULT NULL,
`test5` varchar(255) DEFAULT NULL,
`test6` varchar(255) DEFAULT NULL,
`test7` varchar(255) DEFAULT NULL,
`test8` varchar(255) DEFAULT NULL,
`test9` varchar(255) DEFAULT NULL,
`test10` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
--创建存储过程(插入两百万条数据,大概45秒左右,多执行几次数据就多了)
DROP PROCEDURE IF EXISTS my_insert;
CREATE PROCEDURE my_insert()
BEGIN
DECLARE n int DEFAULT 1;
loopname:LOOP
INSERT INTO `my_tables`(`name`,`age`,`time`,`pwd`)
VALUES ('测试名', 18, '2022-07-27', '369');
SET n=n+1;
IF n=2000000 THEN
LEAVE loopname;
END IF;
END LOOP loopname;
END;
--执行存储过程
CALL my_insert();
2.分页语句
以下sql中select * 写法只是便于测试和展示 实际不要这样使用哦(应该查哪些字段就写哪些字段)!
//查询条数 SELECT count(1) FROM my_tables; 25000021条---0.03秒(count查询真滴快) //只查询索引 SELECT id FROM my_tables limit 20000000,20; 2.965秒 //普通分页查询 SELECT * FROM my_tables limit 20000000,20; 4.441秒 //优化一:子查询方法 SELECT * FROM my_tables where id>=(select id from my_tables limit 20000000,1)limit 20; 2.981秒 //优化二:join查询方法(相比子查询查询速度差不多 速度相比提升30%左右) SELECT * FROM my_tables a JOIN(select id from my_tables limit 20000000,20)b on a.id=b.id; 2.953秒 //优化三:根据主键或者唯一索引排序方法(利用索引快速定位部分数据,避免全表扫描 速度相比提升99%) SELECT * FROM my_tables where id>=20000000 ORDER BY id ASC LIMIT 0,20; 0.038秒
3.实际使用方法:
pageNum:页码
pageSize:一页展示多少条
SELECT * FROM 表名 WHERE id>=(pageNum*pageSize) ORDER BY id ASC LIMIT pageNum,pageSize;
4.错误示例:
//当连表查询或子表查询时 limit最好要放在里面 否则查询时间和数据量 将两表数据条数相乘的几何倍增加
错误:
SELECT * FROM a表 a JOIN(select id from a表) b on a.id=b.id limit 0,20;
正确:
SELECT * FROM a表 a JOIN(select id from a表 limit 0,20) b on a.id=b.id;
错误:
select * from (select * from a表 a left join b表 b on a.id = b.id ) tt where ... limit 0,20
正确:
select * from (select * from a表 a left join b表 b on a.id = b.id limit 0,13) tt where ...
优化到这里就结束啦 以上sql是测试写法 没有添加where条件等等 大家需要根据实际需求改写哦
若文章有误或疑问,欢迎大家留言讨论~
边栏推荐
- 三国演义小说
- 【Redis】通用命令
- Daily practice of dynamic programming (3)
- 【打新必读】麦澜德估值分析,骨盆及产后康复电刺激产品
- This article takes you to understand the commonly used models and frameworks of recommender systems
- 牛客网项目2.7开发注册功能 报错This application has no explicit mapping for /error......
- Overview of Edge Computing Open Source Projects
- cococreator 动态设置精灵
- Rust from entry to master 03-helloworld
- The love-hate relationship between C language volatile keyword, inline assembly volatile and compiler
猜你喜欢
随机推荐
The perceptron perceptron of Li Hang's "Statistical Learning Methods" notes
从零开始入门单片机(一):必会背景知识总结
HikariCP数据库连接池,太快了!
Implementation of mysql connection pool
js防抖函数和函数节流的应用场景
未知内容监控
AutoJs学习-实现谢尔宾斯基三角
ABAP 和json转换的方法
用汇编实现爱心特效【七夕来袭】
【并发编程】- 线程池使用DiscardOldestPolicy策略、DiscardPolicy策略
Facebook自动化数据分析方案,广告投放省心省力
让电商运营10倍提效的自动化工具,你get了吗?
【New Edition】DeepFakes: Creation, Detection and Influence
leetcode 62. Unique Paths(独特的路径)
2022.7.25-7.31 AI行业周刊(第108期):值钱比赚钱更重要
李航《统计学习方法》笔记之感知机perceptron
PyQt5安装配置(PyCharm) 亲测可用
裁员趋势下的大厂面试:“字节跳动”
MySQL安装与卸载详细教程
阿里巴巴 CTO 程立:开源是基础软件的源头!