版权声明:转载需附上本文地址 https://blog.csdn.net/weikaixxxxxx/article/details/86549694
本文使用mysql自带的测试工具mysqlslap来做测试。
测试的数据约有一百万条。不要吐槽我字段命名,它们就是凑数的。
sql语句语法大写
当你小写运行时,mysql需要先转换成大写的,再运行。而直接大写,就无需转换。这能节省一些时间。
避免SELECT * FROM
# mysqlslap --create-schema='test' -q "SELECT * FROM user WHERE name = 'weikaixxxxxx'" -c 1 -i 100 -uroot -proot
并发1,运行100次,执行五次。
第三行,最大执行秒数
:0.433。
只搜索name字段
# mysqlslap --create-schema='test' -q "SELECT name FROM user WHERE name = 'weikaixxxxxx'" -c 1 -i 100 -uroot -proot
第三行,最大执行秒数
:0.415。
五次最大执行时间对比
带*的 | name字段的 |
---|---|
0.370 | 0.415 |
0.433 | 0.348 |
0.427 | 0.384 |
0.348 | 0.345 |
0.376 | 0.369 |
看起来差距不大,带*的五次平均值是0.3908,name字段五次平均值是0.3722。
获取一条数据时加LIMIT
当只要获取一条数据时,加上limit。这样当mysql找到了第一条数据就会返回,从而终止运行。
age字段是不规则的
# mysqlslap --create-schema='test' -q "SELECT * FROM user WHERE age > 1" -c 1 -i 10 -uroot -proot
每次运行10次,执行五次。
最大执行秒数
:2.548。
加limit 1
最大执行秒数
:0.008。
你可能会说,这不是基本操作吗?可我就见过直接搜全部,然后用数组下标0获取。
扫描二维码关注公众号,回复:
5646985 查看本文章
用age>1可能不恰当,但我想不起来什么场景要返回一条数据且这些数据还有重复的。
LIMIT分页
当LIMIT的偏移量越来越大时,执行会越来越慢。
# mysqlslap --create-schema='test' -q "SELECT * FROM user LIMIT 1000000,10" -c 1 -i 10 -uroot -proot
运行十次,执行五次。
最大执行秒数
:0.410。
可以通过先查找到id值,再以id值作为偏移量。
# mysqlslap --create-schema='test' -q "SELECT * FROM user WHERE id>=(SELECT id FROM user LIMIT 1000000,1) LIMIT 10" -c 1 -i 10 -uroot -proot
这样sql语句就是:id大于等于1000001,获取10条。
最大执行秒数
:0.282。
第二种,适合id连续并且没有条件的分页
# mysqlslap --create-schema='test' -q "SELECT * FROM user WHERE id between 1000000 and 1000010" -c 1 -i 10 -uroot -proot
最大执行秒数
:0.018