游戏湿太|怎么快速查询?,面试官:一千万数据

前言
面试官:来说说 , 一千万的数据 , 你是怎么查询的?B哥:直接分页查询 , 使用limit分页 。 面试官:有实操过吗?B哥:肯定有呀此刻献上一首《凉凉》
也许有些人没遇过上千万数据量的表 , 也不清楚查询上千万数据量的时候会发生什么 。
今天就来带大家实操一下 , 这次是基于MySQL5.7.26做测试
准备数据
没有一千万的数据怎么办?
创建呗
代码创建一千万?那是不可能的 , 太慢了 , 可能真的要跑一天 。 可以采用数据库脚本执行速度快很多 。
创建表
CREATETABLE`user_operation_log`(`id`int(11)NOTNULLAUTO_INCREMENT,`user_id`varchar(64)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`ip`varchar(20)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`op_data`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr1`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr2`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr3`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr4`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr5`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr6`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr7`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr8`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr9`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr10`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr11`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,`attr12`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL,PRIMARYKEY(`id`)USINGBTREE)ENGINE=InnoDBAUTO_INCREMENT=1CHARACTERSET=utf8mb4COLLATE=utf8mb4_general_ciROW_FORMAT=Dynamic;创建数据脚本
采用批量插入 , 效率会快很多 , 而且每1000条数就commit , 数据量太大 , 也会导致批量插入效率慢
DELIMITER;;CREATEPROCEDUREbatch_insert_log()BEGINDECLAREiINTDEFAULT1;DECLAREuserIdINTDEFAULT10000000;set@execSql='INSERTINTO`test`.`user_operation_log`(`user_id`,`ip`,`op_data`,`attr1`,`attr2`,`attr3`,`attr4`,`attr5`,`attr6`,`attr7`,`attr8`,`attr9`,`attr10`,`attr11`,`attr12`)VALUES';set@execData='';WHILEi<=10000000DOset@attr='''测试很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的属性''';set@execData=https://pcff.toutiao.jxnews.com.cn/p/20200826/concat(@execData,''('',userId+i,'','10.0.69.175','用户登录操作''','','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'','',@attr,'')'');ifi%1000=0thenset@stmtSql=concat(@execSql,@execData,'';'');preparestmtfrom@stmtSql;executestmt;DEALLOCATEpreparestmt;commit;set@execData='''';elseset@execData=https://pcff.toutiao.jxnews.com.cn/p/20200826/concat(@execData,'','');endif;SETi=i+1;ENDWHILE;END;;DELIMITER;开始测试
哥的电脑配置比较低:win10标压渣渣i5读写约500MB的SSD
由于配置低 , 本次测试只准备了3148000条数据 , 占用了磁盘5G(还没建索引的情况下) , 跑了38min , 电脑配置好的同学 , 可以插入多点数据测试