1000w的数据表,18s执行的SQL优化到0.22s?
时间:2023-09-28 02:07:02
一.废话不多说直接上去
先看看我的MySQL版本
SELECT VERSION();
表结构
desc test;
id为自增主键,val常规索引。
增加1000w数据,测试操作sql文件较快50w数据43s比直接执行sql比跑后端程序快。
SELECT COUNT(*) FROM test;
新建一张表
CREATE TABLE `test` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `val` int(10) NOT NULL, `source` int(10) NOT NULL, PRIMARY KEY (`id`), KEY `val` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=10859137 DEFAULT CHARSET=utf8
我们,当limit offset rows中的offset效率问题很大:
SELECT id,val,source FROM test t WHERE t.val=4 LIMIT 3000000,5;
sql优化改写如下:
SELECT t.id,t.val,t.source FROM test t INNER JOIN (SELECT id FROM test WHERE val=4 LIMIT 3000000,5) b ON t.id=b.id;
时差明显。
我们看一下SELECT id,val,source FROM test t WHERE t.val=4 LIMIT 查询过程3万万,5:
根据索引叶节点的数据。查询叶节点上的主键值到簇索引上所需的所有字段值。
类似下图:
这样,索引列(如图所示)将被完全无用地查询
看第二个sql,
第一次使用索引列(如图),查询要缩短很多