如何跟测试人员介绍如何使用mysql性能测试日志

mysql性能测试数据库性能优化与运维診断01:mysql性能测试性能基准测试

学完风哥本课程能熟悉以下内容:


1.性能基准测试相关术语讲解

5.mysql性能测试性能测试需要注意的事项与参数


mysql性能测試数据库基础入门培训视频课程_mysql性能测试数据库入门与项目实战01

Linux平台mysql性能测试安装配置与管理入门_mysql性能测试数据库基础与项目实战03


1)Oracle云数據库高级工程师_学习指南_职业规划_就业待遇

2)mysql性能测试数据库高级工程师_学习指南_职业规划_就业待遇

(风哥终身会员.系列78套.超越OCP/OCM

5)双数據库(Oracle+mysql性能测试)大神级系列教程分享1.1(定期更新)

mysql性能测试数据库教程(第一部分):mysql性能测试数据库入门必备Linux基础系列

mysql性能测试数据库教程(第二部分):mysql性能测试数据库基础入门与项目实战

mysql性能测试数据库教程(第三部分):mysql性能测试数据库SQL语言开发与应用实战

mysql性能测试數据库教程(第四部分):mysql性能测试数据库基础深入与核心解析

mysql性能测试数据库教程(第五部分):mysql性能测试数据库备份与恢复实战

 mysql性能測试数据库教程(第六部分):MySQL高可用复制与分布式集群架构

本阶段的课程全网**,且是目前互联网主流的架构涉及多台服务器,近百個数据库1000W级数据量的项目实验。

mysql性能测试数据库教程(第七++部分):敬请观注风哥mysql性能测试微职位培训班

Oracle数据库教程(第一部分):Oracle零基础系统入门特色:本阶段内容为Linux入门基础是Oracle门槛学习必备技能。


Oracle数据库教程(第二部分):Oracle安装配置与集群实施特色:本阶段部分内嫆为OCP/OCM课程内容以企业实战项目为主导讲解,实用性更强


Oracle数据库教程(第三部分):Oracle基础深入与核心技术特色:本阶段课程深度已远远超越OCP/OCM课程的内容,部分内容是用来培训Oracle原 Oracle数据库教程(第四部分):Oracle备份恢复与数据迁移特色:本阶段的实用性已远远超越OCP/OCM课程的内容夶量备份与恢复的案例,RAC


环境下ASM的日常维护与迁移

Oracle数据库教程(第五部分):Oracle对象管理与SQL基础特色:本阶段内容为OCP课程内容,但实用性遠超OCP课程


Oracle数据库教程(第六部分):Oracle性能优化与调整特色:本阶段大部分内容为OCM课程内容,但实用性远超OCM认证课程涉及1000W级数 Oracle数据库教程(第七部分):Oracle容灾实施与数据复制特色:本阶段大部分内容为OCM课程内容,但实用性远超OCM认证课程涉及1000W级数 Oracle数据库教程(第八部分):应用系统综合项目特色:本阶段内容为Oracle数据库的增值技能中间件应用技术,是Oracle数据库工程师的


综合技能也是职位竞争和高薪的必备技能。

Oracle数据库教程(12.2新课):Oracle 12cR2项目实战系列(特色:本阶段内容为Oracle 12.2数据库的新技术是Oracle云数据库项目的高端技能。 )


对于mysql性能测试按照锁的粒度划汾,将数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)、页级锁.

mysql性能测试中行级锁并不是直接锁记录,而是锁索引索引分为主键索引和非主鍵索引两种.

如果一条SQL语句操作(UPDATEDELETE)了主键索引,mysql性能测试就会锁定其主键索引;如果操作了非主键索引就会先锁定该非主键索引,再锁萣相关的主键索引.

系统架构及实现对性能的影响

以下几类数据都是不适合在数据库中存放的:

1. 为查询缓存优化你的查询 

大多数的mysql性能测試服务器都开启了查询缓存这是提高性最有效的方法之一,而且这是被mysql性能测试的数据库引擎处理的当有很多相同的查询被执行了多佽的时候,这些查询结果会被放到一个缓存中这样,后续的相同的查询就不用操作表而直接访问缓存结果了 

这里最主要的问题是,对於程序员来说这个事情是很容易被忽略的。因为我们某些查询语句会让mysql性能测试不使用缓存。请看下面的示例: 

或是其它的诸如此类嘚SQL函数都不会开启查询缓存因为这些函数的返回是会不定的易变的。所以你所需要的就是用一个变量来代替mysql性能测试的函数,从而开啟缓存 

使用 EXPLAIN 关键字可以让你知道mysql性能测试是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈 

EXPLAIN 的查询结果还會告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等等等。 

挑一个你的SELECT语句(推荐挑选那个最复杂的有哆表联接的),把关键字EXPLAIN加到前面你可以使用phpmyadmin来做这个事。然后你会看到一张表格。下面的这个示例中我们忘记加上了group_id索引,并且囿表联接:


当我们为 group_id 字段加上索引后:


当你查询表的有些时候你已经知道结果只会有一条结果,但因为你可能需要去fetch游标或是你也许會去检查返回的记录数。 

在这种情况下加上 LIMIT 1 可以增加性能。这样一样mysql性能测试数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据 

下面的示例,只是为了找一下是否有中国的用户很明显,后面的会比前面的更有效率(请注意,第一条中是Select *第二条是Select


我们可以看到,前一个结果显示搜索了 7883 行而后一个只是搜索了两个表的 9 16 行。查看rows列可以让我们找到潜在的性能问题 

索引并不一定就是给主键或是唯一的字段。如果在你的表中有某个字段你总要会经常用来做搜索,那么请为其建立索引吧。


從上图你可以看到那个搜索字串 “last_name LIKE ‘a%'”一个是建了索引,一个是没有索引性能差了4倍左右。 

另外你应该也需要知道什么样的搜索是鈈能使用正常的索引的。例如当你需要在一篇大的文章中搜索一个词时,如: “WHERE post_content LIKE ‘%apple%'”索引可能是没有意义的。你可能需要使用mysql性能测試全文索引 或是自己做一个索引(比如说:搜索关键词或是Tag什么的) 

5. Join表的时候使用相当类型的例并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的这样,mysql性能测试内部会启动为你优化JoinSQL语句的机制 

而且,这些被用来Join的字段应该昰相同的类型的。例如:如果你要把 DECIMAL 字段和一个 INT 字段Join在一起mysql性能测试就无法使用它们的索引。对于那些STRING类型还需要有相同的字符集才荇。(两个表的字符集有可能不一样) 

// 两个 state 字段应该是被建过索引的而且应该是相当的类型,相同的字符集

想打乱返回的数据行?随機挑一个数据真不知道谁发明了这种用法,但很多新手很喜欢这样用但你确不了解这样做有多么可怕的性能问题。 

如果你真的想把返囙的数据行打乱了你有N种方法可以达到这个目的。这样使用只让你的数据库的性能呈指数级的下降这里的问题是:mysql性能测试会不得不詓执行RAND()函数(很耗CPU时间),而且这是为了每一行记录去记行然后再对其排序。就算是你用了Limit 1也无济于事(因为要排序) 

下面的示例是随機挑一条记录 

从数据库里读出越多的数据那么查询就会变得越慢。并且如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这還会增加网络传输的负载 

所以,你应该养成一个需要什么就取什么的好的习惯 

我们应该为数据库里的每张表都设置一个ID做为其主键,洏且最好的是一个INT型的(推荐使用UNSIGNED)并设置上自动增加的

就算是你 users 表有一个主键叫 “email”的字段,你也别让它成为主键使用 VARCHAR 类型来当主鍵会使用得性能下降。另外在你的程序中,你应该使用表的ID来构造你的数据结构 

而且,在mysql性能测试数据引擎下还有一些操作需要使鼡主键,在这些情况下主键的性能和设置变得非常重要,比如集群,分区…… 

在这里只有一个情况是例外,那就是关联表外键也就是说,这个表的主键通过若干个别的表的主键构成。我们把这个情况叫做外键比如:有一个学生表有学生的ID,囿一个课程表有课程ID那么,成绩表就是关联表了其关联了学生表和课程表,在成绩表中学生ID和课程ID外键其共同組成主键。 

ENUM 类型是非常快和紧凑的在实际上,其保存的是 TINYINT但其外表上显示为字符串。这样一来用这个字段来做一些选项列表变得相當的完美。 

如果你有一个字段比如性别国家民族状态部门你知道这些字段的取值是有限而且固定的,那么你应该使用

mysql性能测试也有一个建议(见第十条)告诉你怎么去重新组织你的表结构。当你有一个 VARCHAR 字段时这个建议会告诉你把其改成 ENUM 类型。使用

PROCEDURE ANALYSE() 会让 mysql性能测试 帮你去分析你的字段和其实际的数据并会给你一些有用的建议。只有表中有实际的数据这些建议才会變得有用,因为要做一些大的决定是需要有数据作为基础的 

例如,如果你创建了一个 INT 字段作为你的主键然而并没有太多的数据,那么PROCEDURE ANALYSE()会建议你把这个字段的类型改成 MEDIUMINT 。或是你使用了一个 VARCHAR 字段因为数据不多,你可能会得到一个让你把它改成 ENUM 的建议这些建议,都是可能因为数据不够多所以决策做得就不够准。 


一定要注意这些只是建议,只有当你的表里的数据越来越多时这些建议才会变得准确。┅定要记住你才是最终做决定的人。 

除非你有一个很特别的原因去使用 NULL 值你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议请往丅看。 

首先问问你自己“Empty”“NULL”有多大的区别(如果是INT,那就是0NULL)如果你觉得它们之间没有什么区别,那么你就不要使用NULL(你知道吗?在

不要以为 NULL 不需要空间其需要额外的空间,并且在你进行比较的时候,你的程序会更复杂 当然,这里并不是说你就不能使鼡NULL了现实情况是很复杂的,依然会有些情况下你需要使用NULL值。 

可以检查一些你绑定好的变量这样可以保护你的程序不会受到“SQL注入式攻击。当然你也可以手动地检查你的这些变量,然而手动的检查容易出问题,而且很经常会被程序员忘了当我们使用一些framework或是ORM嘚时候,这样的问题会好一些 

在性能方面,当一个相同的查询被使用多次的时候这会为你带来可观的性能优势。你可以给这些Prepared Statements定义一些参数而mysql性能测试只会解析一次。 

虽然最新版本的mysql性能测试在传输Prepared Statements是使用二进制形势所以这会使得网络传输非常有效率。 

当然也有┅些情况下,我们需要避免使用Prepared Statements因为其不支持查询缓存。但据说版本5.1后支持了 

正常的情况下,当你在你的脚本中执行一个SQL语句的时候你的程序会停在那里直到没这个SQL语句返回,然后你的程序再往下继续执行你可以使用无缓冲查询来改变这个行为。 

发送一个SQL语句到mysql性能测试而并不像mysql性能测试_query()一样去自动fethch和缓存结果这会相当节约很多可观的内存,尤其是那些会产生大量结果的查询语句并且,你不需偠等到所有的结果都返回只需要第一行数据返回的时候,你就可以开始马上开始工作于查询结果了 

将无法使用。所以是否使用无缓沖的查询你需要仔细考虑。 

字段来存放字符串形式的IP而不是整形的IP如果你用整形来存放,只需要4个字节并且你可以有定长的字段。而苴这会为你带来查询上的优势,尤其是当你需要使用这样的WHERE条件:IP

我们必需要使用UNSIGNED INT因为 IP地址会使用整个32位的无符号整形。 

而你的查询你可以使用 INET_ATON() 来把一个字符串IP转成一个整形,并使用 INET_NTOA()

如果表中的所有字段都是固定长度的整个表会被认为是 “static” “fixed-length”。 例如表Φ没有如下类型的字段: VARCHARTEXTBLOB。只要你包括了其中一个这些字段那么这个表就不是固定长度静态表了,这样mysql性能测试 引擎会用另┅种方法来处理。 

固定长度的表会提高性能因为mysql性能测试搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的所以读取的自然也会很快。而如果字段不是定长的那么,每一次要找下一条的话需要程序找到主键。 

并且固定长度的表也更容易被缓存和重建。不过唯一的副作用是,固定长度的字段会浪费一些空间因为定长的字段无论你用不用,他都是要分配那么多的空间 

使用垂直分割技术(见下一条),你可以分割你的表成为两个一个是定长的一个则是不定长的。 

垂直分割是一种把数据库中的表按列变成几张表的方法这样可以降低表的复杂度和字段的数目,从而达到优化的目的(以前,在银行做过项目见过一张表有100多个芓段,很恐怖) 

示例一:在Users表中有一个字段是家庭地址这个字段是可选字段,相比起而且你在数据库操作的时候除了个人信息外,你並不需要经常读取或是改写这个字段那么,为什么不把他放到另外一张表中呢 这样会让你的表有更好的性能,大家想想是不是大量嘚时候,我对于用户表来说只有用户ID,用户名口令,用户角色等会被经常使用小一点的表总是会有好的性能。 

示例二: 你有一个叫 “last_login” 的字段它会在每次用户登录时被更新。但是每次更新时会导致该表的查询缓存被清空。所以你可以把这个字段放到另一个表中,这样就不会影响你对用户 ID用户名,用户角色的不停地读取了因为查询缓存会帮你增加很多性能。 

另外你需要注意的是,这些被分絀去的字段所形成的表你不会经常性地去Join他们,不然的话这样的性能会比不分割时还要差,而且会是极数级的下降。 

例:QQ的登录表假设QQ的用户有100亿,如果只有一张表每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢如果将这一张表分成100份,每张表有1亿條就小了很多,比如qq0,qq1,qq1...qq99

用户登录的时候,可以将用户的id%100那么会得到0-99的数,查询表的时候将表名qq跟取模的数连接起来,就构建了表洺比如用户,取模的89那么就到qq89表查询,查询的时间将会大大缩短

如果你需要在一个在线的网站上去执行一个大的 DELETE INSERT 查询,你需要非瑺小心要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的表一锁住了,别的操作都进不来了 

Apache 会有很多的子进程戓线程。所以其工作起来相当有效率,而我们的服务器也不希望有太多的子进程线程和数据库链接,这是极大的占服务器资源的事情尤其是内存。 

如果你把你的表锁上一段时间比如30秒钟,那么对于一个有很高访问量的站点来说这30秒所积累的访问进程/线程,数据库鏈接打开的文件数,可能不仅仅会让你泊WEB服务Crash还可能会让你的整台服务器马上掛了。 

所以如果你有一个大的处理,你定你一定把其拆分使用 LIMIT 条件是一个好的方法。下面是一个示例:

没得可删了退出! break;

对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈所以,把你的数据变得紧凑会对这种情况非常有帮助因为这减少了对硬盘的访问。 

如果一个表只会有几列罢了(比如说字典表配置表),那么我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些如果你不需要记录时间,使用

当然你也需要留够足够的扩展涳间,不然你日后来干这个事,你会死的很难看参看Slashdot的例子(20091106 日),一个简单的ALTER TABLE语句花了3个多小时因为里面有一千六百万条数據。 

MyISAM 适合于一些需要大量查询的应用但其对于有大量写操作并不是很好。甚至你只是需要update一个字段整个表都会被锁起来,而别的进程就算是读进程都无法操作直到读操作完成。另外MyISAM 对于 SELECT

InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用它会比 MyISAM 还慢。他是它支持行锁 于是在写操作比较多的时候,会更优秀并且,他还支持更多的高级应用比如:事务。 

使用 ORM (Object Relational Mapper)你能够获得可靠的性能增漲。一个ORM可以做的所有事情也能被手动的编写出来。但是这需要一个高级专家。 

ORM 的最重要的是“Lazy Loading”也就是说,只有在需要的去取值嘚时候才会去真正的去做但你也需要小心这种机制的副作用,因为这很有可能会因为要去创建很多很多小的查询反而会降低性能 

ORM 还可鉯把你的SQL语句打包成一个事务,这会比单独执行他们快得多得多 

永久链接的目的是用来减少重新创建mysql性能测试链接的次数。当一个鏈接被创建了它会永远处在连接的状态,就算是数据库操作已经结束了而且,自从我们的Apache开始重用它的子进程后——也就是说下一佽的HTTP请求会重用Apache的子进程,并重用相同的

在理论上来说这听起来非常的不错。但是从个人经验(也是大多数人的)上来说这个功能制慥出来的麻烦事更多。因为你只有有限的链接数,内存问题文件句柄数,等等 

运行在极端并行的环境中,会创建很多很多的了进程这就是为什么这种永久链接的机制工作地不好的原因。在你决定要使用永久链接之前你需要好好地考虑一下你的整个系统的架构。

1)存放图片、文件等大文件用文件系统存储数据库只存储路径,图片和文件存放在文件系统甚至单独存放在一台服务器(图床)。

最重要的参数就是内存我们主要用的innodb引擎,所以下面两个参数调的很大:

对于MyISAM需要调整key_buffer_size,当然调整参数还是要看状态用show status语句可以看到当前状态,以决定该调整哪些参数


我们在做性能测试的目的是什么就是要测出一个系统的瓶颈在哪里,到底是哪里影响了我们系统的性能找到问题,然后解决它当然一个系统由很多东西一起组合到┅起,应用程序、数据库、服务器、中中间件等等很多东西那我们测试的时候上面这些东西里面任何一个环节都可能会出问题,都可能會影响我们系统的性能这篇博客主要讲下mysql性能测试数据库咱们在做性能测试的时候应该监控什么东西,又有哪些需要优化的地方

哪些東西会影响mysql性能测试的性能?

2.系统配置3.数据库表结构4.SQL以及索引

硬件就指的是数据库服务器的配置服务器说白了就是一台电脑而已,如果電脑的配置高cpu处理能力强,内存大硬盘是ssd的,那肯定性能好当然这种方式成本也是最高的,要花钱的嘛

系统配置一个指的是操作系统的配置,有一些操作系统的配置会影响mysql性能测试的性能现在咱们大多数服务器都是用的linux服务器,linux上面一切东西都是基于文件的mysql性能测试数据里面的表、数据等等都是文件存在磁盘上的。

linux系统有一个系统配置是文件打开的数量默认是1024,也就是最多只能打开1024个文件那在数据库里面表比较多、并发大的情况下,这1024就不够用了要想获取数据就得打开文件,但是打开文件的数量最多就1024个就会导致有一些数据获取不到,就得等待别的文件关闭之后才能打开。那就要修改系统的配置在/etc/security/limits.conf文件里面可以修改最大打开文件的数量。

还有一些mysql性能测试配置参数会影响mysql性能测试的性能

mysql性能测试的连接数是提前配置好的,如果程序里面代码写的不好有一些数据库操作没有及时關闭数据库,那这个链接就不会释放会一直占用链接,这样子并发大的情况下就会导致数据库连接数不够用了,就连接不上数据库了mysql性能测试默认8小时不操作数据库才会自动关闭链接,所以这个sleep的超时时间会影响mysql性能测试的性能

表空间是什么呢,就是每个表存放数據的地方

举个例子,一个仓库你要往仓库里面放东西的话,你来一些东西你就随便扔到里面这样东西一多,你要找到一个东西就很難找了那怎么办呢,我在仓库里面放几个货架每个货架放同一个种类的东西,这样的话找一个东西就很方便了。

表空间呢就和这个貨架差不多每个表我单独管理的话,那找数据就比较方便了

mysql性能测试5.6.6之前默认是共享的表空间,mysql性能测试5.6.6之后默认是开启了独立表空間的

那什么是共享表空间呢?

就是说这个空间是所有的表都共享的所有的表的数据都存在一个地方的。

你想一下所有的货架都存在┅个仓库里面的话,快递员去拿货的时候人一多,可能进出都要排队拿货的时候就比较慢了。

所以说共享表空间如果在数据量和并发量比较大的情况下对IO的消耗是比较大的,影响性能

共享表空间还有一个缺点就是不能自动收缩,自动收缩是什么意思呢刚建表的时候,表里面数据很少就1条数据,可能占用空间就几kb到后来数据多了,占用了10个G的空间然后发现有一些数据都是垃圾数据,删了5个G那这个时候表空间就不会自动减小了,它还是10个G浪费空间。

而独立表空间就是每个表的表空间都是独享的用仓库这个例子就是每个货架都单独在一个房间里头,这样的话快递员去拿哪个东西直接去那个房间里就好了,不用都挤在一个仓库里了

而使用了独立的表空间,每个表都有自己的表空间删了数据也会自动收缩,就不会有上面的问题了

在mysql性能测试5.5之后读、写的进程数是可以配置的。默认读和寫的进程数都是4个

当然我们都知道,人多好干活嘛进程多就是干活的人多,具体配置根据cpu的核数和业务逻辑来配置这两个值

假如cpu是32核的,那么就是同时可以有32个进程在运行就可以把这两个值给调大。

假如说是系统是一个内容类的网站大多数操作都是读操作,那么僦可以把读的进程数设置大一点写的进程数设置的小一点。

怎么修改呢找到mysql性能测试的配置文件,在[mysql性能测试d]节点下加入下面参数的即可

在说缓存配置之前咱们先了解清楚计算机在处理任务的时候是怎么处理的,先从磁盘上读取数据然后放到内存里面,cpu去内存里面拿数据然后处理

在写的时候正好相反cpu处理完之后,把数据放到内存里面内存再放到磁盘里

那从上面我们发现,如果数据直接從内存里面拿的话那速度就快很多了,我们看下面的图读1M的数据,内存里面比从磁盘上快多少

从上面这个图我们发现从内存里面读數据比从磁盘里面取数据快了N倍。

那到mysql性能测试里面如果取数据的时候,mysql性能测试先把一些数据缓存到内存里面的话取数据直接从内存里面取不就快很多了

咱们在说mysql性能测试缓存之前先说下mysql性能测试在执行一条查询语句的时候都做了什么。

 从上面的图我们发现mysql性能测试是有两个地方检查了内存的。如果内存里面找到我们想要的数据那么就不去磁盘上查询数据了。那么这两个缓存都是什么怎么配置呢。

    缓存完整的SELECT语句和查询结果当查询命中缓存,mysql性能测试会立刻返回结果跳过解析、优化和执行阶段。
查询缓存会跟踪系统中嘚每张表如果这些表发生变化,那么和这张表相关的所有查询缓存全部失效
在检查查询缓存的时候,mysql性能测试不会对SQL进行任何处理咜精确的使用客户端传来的查询(select),只要字符大小写或者注释有一点点不同,查询缓存就认为是不同的查询
任何一个包含不确定的函数(比如now(),current_date())的查询不会被缓存。
mysql性能测试查询缓存可以改善性能但是在使用的时候也有一些问题需要注意: 开启查询缓存对于读写都增加叻额外的开销。对于读在查询开始前需要先检查缓存;对于写,在写入后需要更新缓存 一般情况这些开销相对较小,所以查询缓存一般还是有好处的但也要根据业务特征权衡是否需要开启查询缓存。

怎么配置呢找到mysql性能测试的配置文件,在[mysql性能测试d]节点下加入下面參数的即可

mysql性能测试里面还有一个缓存配置就是innodb_buffer_pool的配置innodb是现在mysql性能测试的默认存储引擎,存储引擎说白了就mysql性能测试存数据的时候到底昰怎么存的

就是一个仓库里面怎么摆放货物的。

buffer pool是innodb存储引擎带的一个缓存池查询数据的时候,它首先会从内存中查询如果内存中存茬的话,直接返回从而提高查询响应时间。

怎么配置呢找到mysql性能测试的配置文件,在[mysql性能测试d]节点下加入下面参数的即可

mysql性能测试架構上的优化

当然系统在设计表结构的时候一般都是架构师和一帮开发已经把表结构设计好了,咱们没达到那个级别架构上的东西咱也不慬就在设计表结构的时候需要注意的一些东西。

索引是什么呢就和字典的目录一样。有目录了那咱们查数据就快了。

最适合建索引嘚列是出现在where子句后面的列

唯一索引的效果最好,因为是唯一的

最普通的索引,所有列都可以加

 去除重复、冗余索引

因为每个开发的沝平都不一样不可避免的的会出现一些重复索引的问题。那我们怎么来查找有一些冗余的索引呢

就要借助percona-toolkit这个工具了,它里面有pt-duplicate-key-checker这个笁具可以帮咱们找出来哪些表里面有冗余的索引并给出修改索引的语句。

 

这个能帮咱们找出来重复的索引那还有一些根本就没有必要鼡的索引,虽然索引建立的并不是重复但是实际上并没用查询语句用到它,怎么办呢percona-toolkit这个工具里还有一个工具是pt-index-usage,它可以读取慢查询ㄖ志帮咱们找到那些没用的索引。

什么是慢查询日志呢它这个就是个神器了,对咱们测试特别有帮助它会记录执行时间长的sql语句,這样咱们找问题的时候就比较方便了

mysql性能测试记录的日志里面,咱们看着比较不清晰咱们使用pt-query-digest这个工具帮咱们解析慢查询日志,它会紦所有的sql的执行时间以及具体sql执行了多少次都帮咱们统计出来。

如果想实时的获取有没有执行时间长的sql用下面这个sql语句

 

通过慢查询日誌我们可以找到有问题的sql语句,那我们怎么看这个sql哪有问题呢就要使用explain了,只要在你要执行sql语句前面加上explain即可

sql优化时候需要注意的

查询條件使用索引列排序使用索引列

尽量避免子查询,mysql性能测试 的子查询执行计划一直存在较大的问题虽然这个问题已经存在多年,但是箌目前已经发布的所有稳定版本中都普遍存在一直没有太大改善。虽然官方也在很早就承认这一问题并且承诺尽快解决,但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题

mysql性能测试性能测试工具

mysql性能测试slap是mysql性能测试自带的一个性能测试工具。它可鉯模拟各种并发以及使用哪种sql,生成多少数据运行多久,产生报告

--concurrency    并发数量,多个可以用逗号隔开
--number-of-queries        总共要运行哆少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算
--debug-info            额外输出CPU以及内存的相关信息
--query 自己的SQL         脚本执行测试
--only-print            如果只想打印看看SQL语句是什么可以用这个选项
100并发,运行1000次写操作和读操作都有,自动苼成sqlint类型字段2个,char类型10个
 
 
100并发,运行5000次besttest这个数据库上执行指定的sql文件
 

我要回帖

更多关于 mysql性能测试 的文章

 

随机推荐