MySQL字符函数的压力测试

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL中的字符串处理函数非常多,以至于我在整理的这部分内容的时候也眼前一亮,有一种进了大观园的感觉,哦,原来有这个函数,哦,竟然可以这样实现,以前怎么没想到,等等。

MySQL中的字符串处理函数非常多,以至于我在整理的这部分内容的时候也眼前一亮,有一种进了大观园的感觉,哦,原来有这个函数,哦,竟然可以这样实现,以前怎么没想到,等等。


比如字符串查找函数,instr,locate,position三个函数的功能都是很相似的。如果要实现一个功能,从字符串foobarbar里面找到bar这个字符串的起始位置,使用Instr,locate,position都可以实现。


SELECT INSTR('foobarbar', 'bar');


SELECT LOCATE('bar', 'foobarbar');


SELECT POSITION('bar' IN 'foobarbar');


主要语法的表现形式不同,当然参数设置上还是有一些差别。


对于上面的3个函数,我有些纠结,到底用哪一个呢?推荐是哪一个呢?我觉得可以通过两种测试方式来得到一个初步的结论,第一个是高并发下多线程调用的性能情况,第二个是单线程执行的性能情况。如果在对比测试中高出一筹,还有什么理由不去推荐呢。


要实现这两个功能,MySQL缺失提供了这样的工具集,第一个是并发执行的性能情况,可以使用MySQL自带的mysqlslap来测试。


而第二个单线程的压测,则可以使用MySQL非常有特色的函数benchmark来实现。


如果使用myslap来压测,使用mysqlslap的语句类似下面的形式。


mysqlslap --concurrency=50,100 --create-schema="test" --query="SELECT POSITION('bar' in 'foobar');" --number-of-queries=50000


当然这里我们加大难度,一个是拼接的字符串要复杂,我们可以使用字符串函数repeat得到一个很长的字符串,比如concat(concat(repeat('abc',500),'foobarbar'),repeat('abc',500)) 就可以得到一个很长的字符串。


img_ee8ec566e71664601fdd24b830f221a3.jpe


通过这种方式得到的测试结果相对来说更有意义一些。


我们调大调用的频次为100万次,使用并发50和100来做测试。


position函数的结果


Benchmark


Average number of seconds to run all queries: 34.789seconds


Minimum number of seconds to run all queries: 34.789 seconds


Maximum number of seconds to run all queries: 34.789 seconds


Number of clients running queries: 50


Average number of queries per client: 20000


Benchmark


Average number of seconds to run all queries: 35.312 seconds


Minimum number of seconds to run all queries: 35.312 seconds


Maximum number of seconds to run all queries: 35.312 seconds


Number of clients running queries: 100


Average number of queries per client: 10000


可以看出在并发50和100的情况下,100的调用时间略长。


使用locate和Instr得到的结果相仿,都是36秒~37秒之间。


从100万次的测试中我们可以得到一个初步udev结论,那就是在这个场景中,position的性能相当要好一些。


而单线程的压测情况如何呢,我们使用benchmark来模拟。


比如压测md5的函数,就是这样的格式。


select benchmark( 500000000, md5( 'test' ) );


对于position和locate,instr,只是需要调整一下函数就可以了,我们还是指定为100万次。


position,locate,instr的性能结果是


1 row in set (8.23 sec)


1 row in set (8.21 sec)


1 row in set (8.23 sec)


可以看出来性能几乎是一样的,locate略微高一点点。


从这个测试也可以看出明显的性能差别,单线程压测的时候是8秒多,但是并发的时候就是36秒左右,这个差别其实很大了。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
25天前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
20 1
|
25天前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
24 1
|
1月前
|
关系型数据库 MySQL 索引
936. 【mysql】locate函数
936. 【mysql】locate函数
18 2
|
1月前
|
SQL 关系型数据库 MySQL
927. 【mysql】coalesce 函数
927. 【mysql】coalesce 函数
21 3
|
1月前
|
关系型数据库 MySQL
926.【mysql】 date 函数
926.【mysql】 date 函数
60 3
|
1月前
|
关系型数据库 MySQL
925. 【mysql】convert 函数
925. 【mysql】convert 函数
23 3
|
2月前
|
关系型数据库 MySQL 索引
mysql常见函数
mysql常见函数
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
28 0
|
4天前
|
SQL 关系型数据库 MySQL
DQL语言之常见函数(mysql)
DQL语言之常见函数(mysql)
|
11天前
|
SQL 关系型数据库 MySQL
mysql多表查询、函数查询
mysql多表查询、函数查询