1000w的数据表,18s执行的SQL优化到0.22s?

一.废话不多说直接上

先看一下我的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 3000000,5的查询过程:

根据到索引叶子节点数据。查询叶子节点上的主键值去簇索引上需要的全部字段值。

类似于下面这张图:

像这样,完全没用用到索引列(就如图所示)会全部查询

看第二个sql,

第一次就用到索引列就(就如图表一样),查询要缩短很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值