mysql使用索引和不使用索引的查询效率实验

1、环境准备

mysql服务器使用Thinkpad T480,客户端使用Mac pro;mysql版本为8.0.33

准备存放不同数量的几张表,表结构和行内容示例如下,为每个表的‘key2’列创建索引

create table test_100
(
    id   bigint auto_increment primary key,
    name varchar(32) not null,
    key1 varchar(32) not null,
    key2 varchar(32) not null,
    key3 varchar(32) not null,
    key4 varchar(32) not null
);

create index idx_key2
    on test_100 (key2);

 以下为所有表,数字代表表内存放的行记录数:

 每张表在插入完数据后所占的空间大小如下:

2、开始测试

为每张表创建entity和mapper,我在这使用Mbaits-plus操作数据库

编写测试类,考虑到篇幅,这里只放一个100行数据表的测试方法,其他的都类似:


	public void test100_all() {
		// 100行数据
		LambdaQueryWrapper<Test100> wrapper = new LambdaQueryWrapper<>();
		// 非索引列查询
		wrapper.eq(Test100::getKey1, "CbBxYcvaCq");
		long now = System.currentTimeMillis();
		test100Mapper.selectList(wrapper);
		System.out.println("100行-全表扫描:" + (System.currentTimeMillis() - now) + "ms");
	}

	public void test100_ref() {
		// 100行数据
		LambdaQueryWrapper<Test100> wrapper = new LambdaQueryWrapper<>();
		// 索引列查询
		long now = System.currentTimeMillis();
		wrapper.clear();
		wrapper.eq(Test100::getKey2, "aXQBEneQDA");
		test100Mapper.selectList(wrapper);
		System.out.println("100行-命中索引:" + (System.currentTimeMillis() - now) + "ms");
	}

因为对同一张表的两个方法同时调,考虑到mysql对页数据缓存会影响查询结果,所以按照两种顺序都调用一下,测试结果如下:

表名先全表再索引先索引再全表结论|效率
test100
100行-全表扫描:165ms
100行-命中索引:39ms
100行-命中索引:171ms
100行-全表扫描:38ms
差不多
  test10001000行-全表扫描:142ms
1000行-命中索引:61ms
1000行-命中索引:175ms
1000行-全表扫描:74ms
差不多
test10000
一万行-全表扫描:269ms
一万行-命中索引:67ms
一万行-命中索引:148ms
一万行-全表扫描:32ms
差不多
test100000
十万行-全表扫描:194ms
十万行-命中索引:40ms
十万行-命中索引:225ms
十万行-全表扫描:226ms
出现差别
test1000000
一百万行-全表扫描:837ms
一百万行-命中索引:99ms
一百万行-命中索引:162ms
一百万行-全表扫描:593ms
明显差别
test5000000
五百万行-全表扫描:3237ms
五百万行-命中索引:49ms
五百万行-命中索引:142ms
五百万行-全表扫描:2866ms
差别很大
test10000000
一千万行-全表扫描:5796ms
一千万行-命中索引:72ms
一千万行-命中索引:187ms
一千万行-全表扫描:5639ms
差别很大
test100000000
一亿行-全表扫描:超时
一亿行-命中索引:192ms

一亿行-命中索引:164ms

一亿行-全表扫描:超时

差别非常大

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值