MySql性能优化

0 引言

MySQL优化,一方面是找出系统的瓶颈,提高MySQL数据库整体的性能;另一方面需要合理的结构设计和参数调整,以提高用户操作响应的速度;同时还要尽可能节省系统资源,以便系统可以提供更大负荷的服务。

在MySQL中,可以使用SHOW STATUS语句查询一些MySQL数据库的性能参数。SHOW STATUS语句的语法如下:

  SHOW STATUS LIKE 'value';

其中,value是要查询的参数值,一些常用的性能参数如下:

● Connections:连接MySQL服务器的次数。

● Uptime:MySQL服务器的上线时间。

● Slow_queries:慢查询的次数。

● Com_select:查询操作的次数。

● Com_insert:插入操作的次数。

● Com_update:更新操作的次数。

● Com_delete:删除操作的次数。

 1 优化查询

查询是数据库中最频繁的操作,提高查询速度可以有效地提高MySQL数据库的性能。

1.1 分析查询语句

EXPLAIN 是MySQL提供的一个非常有用的命令,用于查看查询语句的执行计划。通过执行计划,你可以了解MySQL如何解析和执行你的查询,从而找出可能的性能瓶颈。

使用 EXPLAIN 的基本语法如下:

EXPLAIN SELECT * FROM your_table WHERE your_conditions;

 ● id:SELECT识别符。这是SELECT的查询序列号。

● select_type:表示SELECT语句的类型。它可以是以下几种取值:SIMPLE表示简单查询,其中不包括连接查询和子查询;PRIMARY表示主查询,或者是最外层的查询语句;UNION表示连接查询的第2个或后面的查询语句;DEPENDENT UNION,连接查询中的第2个或后面的SELECT语句,取决于外面的查询;UNION RESULT,连接查询的结果;SUBQUERY,子查询中的第1个SELECT语句;DEPENDENT SUBQUERY,子查询中的第1个SELECT,取决于外面的查询;DERIVED,导出表的SELECT(FROM子句的子查询)。

● table:表示查询的表。

● type:表示表的连接类型。以下是type列中可能出现的一些值及其含义:

system
这是最好的连接类型,表示只有一行被检索。这通常发生在系统表或常量表的查询中。

const
表示表有一个匹配的行,常用于通过主键或唯一索引查找的记录。

eq_ref
每个从表的行与主表的恰好一行相匹配,通常用于主键或唯一索引的JOIN操作。

ref
非唯一索引的查找,返回匹配某个单独值的所有行。常用于使用非唯一索引或主键查找。

fulltext
使用全文索引进行搜索。

ref_or_null
类似于ref,但MySQL还会查找包含NULL值的行。

index_merge
表示MySQL使用了索引合并优化方法。

unique_subquery
在IN子查询中,子查询返回的结果集是唯一的。

index_subquery
与unique_subquery类似,但子查询返回的结果集可能包含重复值。

range
用于范围查询,例如使用BETWEEN或<、>操作符。

index
全索引扫描,即遍历整个索引来查找匹配的行。这比全表扫描更快,因为索引的大小通常小于表数据。

ALL
全表扫描,最坏的情况。如果MySQL选择这种方法,那么通常意味着没有可用的索引来优化查询,或者查询优化器认为全表扫描更快。

1.2 索引对查询速度的影响

MySQL中提高性能的一个有效方式就是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且可加快查询的速度,因此,索引对查询的速度有着至关重要的影响。使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度、提高数据库的性能。如果查询时没有使用索引,查询语句将扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。如果使用索引进行查询,查询语句可以根据索引快速定位到待查询记录,从而减少查询的记录数,达到提高查询速度的目的。

1.2.1 使用索引查询

索引可以提高查询的速度,但并不是使用带有索引的字段查询时索引都会起作用。

使用索引有几种特殊情况,在这些情况下有可能使用带有索引的字段查询时索引并没有起作用。

 1.2.1.1 使用LIKE关键字的查询语句

在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置,索引才会起作用。

索引无效

索引有效

 1.2.1.2 使用多列索引的查询语句

MySQL可以为多个字段创建索引。一个索引可以包括16个字段。对于多列索引,只有查询条件中使用了这些字段中的第1个字段时索引才会被使用。

f_id='12'索引有效

f_price=5.2 ,索引的第二列,索引无效

 1.2.1.3 使用OR关键字的查询语句

 查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询中才使用索引;否则,查询将不使用索引。

1.3 优化子查询

子查询可以一次性完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然可以使查询语句很灵活,但执行效率不高。执行子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。

在MySQL中,可以使用连接(JOIN)查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快,如果查询中使用索引,性能会更好。连接之所以更有效率,是因为MySQL不需要在内存中创建临时表来完成查询工作。

2 优化数据库结构

2.1 将字段很多的表分解成多个表

对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来,形成新表。因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。

2.2 增加中间表

对于需要经常联合查询的表,可以建立中间表,以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率。

2.3 增加冗余字段

设计数据库表时应尽量遵循范式理论的规约,尽可能减少冗余字段,让数据库设计看起来精致、优雅。但是,合理地加入冗余字段可以提高查询速度。表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。

2.4 优化插入记录的速度

插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。

对于InnoDB引擎的表,常见的优化方法如下:

禁用唯一性检查;禁用外键检查;禁止自动提交。

2.5 分析表、检查表和优化表

分析表

  ANALYZE  TABLE tbl_name;

● Table:表示分析的表的名称。

● Op:表示执行的操作。analyze表示进行分析操作。

● Msg_type:表示信息类型,其值通常是状态(status)、信息(info)、注意(note)、警告(warning)和错误(error)之一。

● Msg_text:显示信息。

检查表

  CHECK  TABLE tbl_name;

 优化表

MySQL中使用OPTIMIZE TABLE语句来优化表,OPTILMIZE TABLE语句只能优化表中VARCHAR、BLOB或TEXT类型的字段。

  OPTIMIZE  TABLE tbl_name;

 

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值