测试百万级数据下mysql in查询效率
- 发布时间:
- 2021-11-17 15:48:13
自己在做项目时,前期的架构往往希望能够做到效率高,性能强。最近在做内容模块开发时,需要有post、tag关联,考虑如果文章量级上来之后,通过文章的tagid聚合查询会影响效率,是否要通过中间表,或者mysql in查询能否撑得起量级的查询。
于是便写了个测试来验证一下在没有做中间表的情况下,通过in查询是否会影响效率。
写了个生成100W测试数据代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/** * 生成查询片段 */ public function ttt(){ for($i=0;$i<100;$i++){ $rand_num=rand(1,5); for($a=0;$a<$rand_num;$a++){ $tagval[]=rand(1,1000); } $b[]='("'.implode(',',$tagval).'")'; $tagval=[]; $c=implode(',',$b); } return $c; } /** * 关于test表大数据下用in查询效率的表现 */ public function test(){ for($i=0;$i<10000;$i++){ $aaa=$this->ttt(); $sql="insert into ay_test (`tag`) values ".$aaa; Db::query($sql); } } |
测试数据表ay_test:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for ay_test -- ---------------------------- DROP TABLE IF EXISTS `ay_test`; CREATE TABLE `ay_test` ( `id` int(10) NOT NULL AUTO_INCREMENT, `tag` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1000001 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; |
模拟一篇文章的tag数量在1到5个不等。生成后如下图
100W测试数据:
简单粗暴直接从这100万数据里面通过in查询出包含指定tagid的文章列表。
以上从100W数据里面查询tagid包含666,888的数据,查询用时:0.373s!
看来in能胜任的,那就按简单的来搞,先不需要做中间表了。而后我又把测试数据量往上加,200W左右都能做到1秒内(0.73)完成,测试到700W时需要3秒左右(2.893s)。普通网站文章量达到万级都难,更别说十万级,百万级了。
至于有朋友说到高并发时的效率,这个已经不在今天话题的范畴了。
- 标签
- mysql查询效率
你可能感兴趣的文章:
- 暂无相关文章
共有 0 条评论