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)) 就可以得到一个很长的字符串。

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

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

position函数的结果

Benchmark Average number of seconds to run all queries: 34.789 seconds 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秒左右,这个差别其实很大了。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

十条有用的 Golang语言 技术

十条有用的 Go 技术 这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践。我相信它们具有弹性的。这里的弹性是指: 某个应用需要适配一个灵...

3676
来自专栏WeTest质量开放平台团队的专栏

Unity3d底层数据传递分析

这篇文章主要分析了在Mono框架下,非托管堆、运行时、托管堆如何关联,以及通过哪些方式调用。内存方面,介绍了什么是封送,以及类和结构体的关系和区别。

5972
来自专栏程序员宝库

十个 PHP 开发者最容易犯的错误

PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因。但也是因为它的简单,PHP 也慢慢发展成一个相对复杂的语言,层出不穷的框架,各种语言特性和...

4569
来自专栏用户2442861的专栏

网易2011笔试题详解

http://blog.csdn.net/silangquan/article/details/18051675

501
来自专栏大闲人柴毛毛

柴毛毛大话设计模式——开发常用的设计模式梳理

写在最前 本文是笔者的一点经验总结,主要介绍几种在Web开发中使用频率较高的设计模式。 本文篇幅较长,建议各位同学挑选感兴趣的设计模式阅读。 在阅读的同时,也...

4787
来自专栏KK的小酒馆

手绘设计模式结构图

GoF的设计模式一共23个,可以分为3大类:创建型、结构型和行为型,这篇文章主要讨论创建型。

1591
来自专栏PHP在线

十个 PHP 开发者最容易犯的错误

PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因。但也是因为它的简单,PHP 也慢慢发展成一个相对复杂的语言,层出不穷的框架,各种语言特性和...

3745
来自专栏落影的专栏

iOS开发笔记(一)

前言 iOS开发笔记(一) iOS开发笔记(二) iOS开发笔记(三) iOS开发笔记(四) 《开发笔记》系列记录一些开发中遇到的问题以及思考。 本文主...

3247
来自专栏哲学驱动设计

Rafy 框架 - 通用查询条件(CommonQueryCriteria)

在应用开发过程中,有 80% 的场景下,开发者所需要的实体查询,查询条件中其实都是一些简单的属性匹配,又或是一些属性匹配的简单组合。Rafy 为这样的场景提供了...

2097
来自专栏Golang语言社区

Go语言的 10 个实用技术--转

十条有用的 Go 技术   这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践。我相信它们具有弹性的。这里的弹性是指:   某个应用需要适配...

3537

扫码关注云+社区