一.废话不多说直接上
先看一下我的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,
第一次就用到索引列就(就如图表一样),查询要缩短很多