MySQL优化(四) - 查询

版权声明:转载需附上本文地址 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获取。

用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

猜你喜欢

转载自blog.csdn.net/weikaixxxxxx/article/details/86549694