一、准备表数据
咱们建一张用户表,表中的字段有用户ID、用户名、地址、记录创建时间,如图所示

OK,接下来准备写一个存储过程插入一百万条数据
CREATE TABLE `t_user` (
`id` int NOT NULL,
`user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DELIMITER ;;
CREATE PROCEDURE user_insert()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<1000000
DO
INSERT INTO t_user(id, user_name, address, create_time) VALUES (i, CONCAT('mayun',i), '浙江杭州', now());
SET i=i+1;
END WHILE ;
commit;
END;;
CALL user_insert();
插入完后咱们看看数据条数

二、优化方式
1.分页查询优化
OK,咱们看下分页limit到一定值时的耗时是多少
-
limit 1000时

-
limit 10000时

-
limit 100000时

-
limit 1000000时

可以看到limit值越大,耗时越长,这还只是一百万数据,要是千万级、亿级呢?
OK不废话,咱们马上进行分页优化
-
子查询优化

-
可以看到比起之前 limit 1000000时的0.218s 效率提高了很多
-
使用JOIN分页

-
可以看到比起之前 limit 1000000时的0.218s 效率也同样提高了很多
-
使用前一次查询的最大ID

可以看到这种方法效率最高,但依赖于需要知道最大ID,这种适合点击下一页查询(类似于滚动加载数据)的场景
-
通过伪列对ID进行分页

然后可以开启多个线程去进行最高效率查询语句的批量查询操作 0~10000,10001-20000.... 这样子的话可以快速把全量数据查询出来同步至缓存中。
分页优化总结:使用前一次查询的最大ID进行查

本文介绍了MySQL海量数据的优化策略,包括分页查询优化,如子查询和JOIN方法,以及普通索引和复合索引的优化。此外,还讨论了SQL查询优化,事务优化,数据库性能提升,如开启查询缓存,并提供了表字段和分布式场景下的优化建议。通过这些技巧,可以在面试中自信应对海量数据处理的问题。
 吊打面试官&spm=1001.2101.3001.5002&articleId=124890861&d=1&t=3&u=0a178a4384a14f87bfb00a9429aedb33)
4万+

被折叠的 条评论
为什么被折叠?



