关于MySQL判断表中是否存在某数据用COUNT还是LIMIT实测
在日常开发中我们经常会遇到需要判断数据库中是否存在某数据的情况,这时候就会纠结是用COUNT还是LIMIT或者什么时候该用COUNT什么时候该用LIMIT,今天我们就来实测一下。
前置环境
服务器环境:阿里云2核2G云服务器
MySQL版本:8.0.36
MySQL引擎:InnoDB
测试表:测试表结构是我实际工作中的表结构这里就不贴出来了,表中有近百个字段。PS:我知道字段多得不合理已经在设计拆表了
测试
同一张表我们测试两种表数据量1W条数据和500W条数据。模拟实际中的中小表和大表。每条测试5次将测试结果展示出来,下面上结果:
1w条数据COUNT
SELECT COUNT(*) FROM order WHERE activity_id = '14d9fcb4-b2c1-4241-9207-db79ac01582d'
执行时长:0.709s|0.714s|0.705s|0.716s|0.772s
1w条数据limit
SELECT id FROM order WHERE activity_id = '14d9fcb4-b2c1-4241-9207-db79ac01582d' LIMIT 1
执行时长:0.852s|0.950s|0.859s|0.833s|0.897s
1w条数据COUNT+索引
SELECT COUNT(*) FROM order WHERE customer_id = '534d41c5-7253-429f-a88e-25ea48076b90'
执行时长:0.302s|0.204s|0.272s|0.166s|0.341s
1w条数据limit+索引
SELECT id FROM order WHERE customer_id = '534d41c5-7253-429f-a88e-25ea48076b90' LIMIT 1
执行时长:0.564s|0.620s|0.592s|0.620s|0.677s
500w条数据COUNT
SELECT COUNT(*) FROM order WHERE activity_id = 'ec95897a-3b5a-473e-b22c-cdbcd1c95f40'
执行时长:8.565s|8.949s|8.493s|8.186s|8.704s
500w条数据limit
SELECT id FROM order WHERE activity_id = 'ec95897a-3b5a-473e-b22c-cdbcd1c95f40' LIMIT 1
执行时长:1.049s|1.163s|1.172s|1.318s|1.206s
500w条数据COUNT+索引
SELECT COUNT(*) FROM order WHERE customer_id = 'a147ba3d-7d0e-460d-885c-706fb1ff7050'
执行时长: 1.440s|1.380s|1.503s|1.648s|1.422s
500w条数据limit+索引
SELECT id FROM order WHERE customer_id = 'a147ba3d-7d0e-460d-885c-706fb1ff7050' LIMIT 1
执行时长:0.677s|0.833s|0.812s|0.734s|0.795s
总结
- 当表数据量小的时候COUNT仍然是不二选择
- 当表数据量大的时候limit可以避免全表扫描效率比COUNT要高,当然这需要你的表里有符合条件的数据
- 对于需要经常查询的字段加上索引能显著的提升查询效率