Mysql性能优化

标签: mysql 性能优化 | 发表时间:2014-02-20 21:50 | 作者:小简
出处:http://www.iteye.com
MySQL性能优化

  性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:

优化查询
优化数据库结构
优化MySQL服务器


  数据库管理人员可以使用SHOW STATUS语句来查询MySQL数据库的性能。语法:SHOW STATUE LIKE ‘value’;其中value参数是常用的几个统计参数。

Connections:连接MySQL服务器的次数

Uptime:MySQL服务器的上线时间;

Slow_queries:慢查询的次数;

Com_select:查询操做的次数;

Com_insert:插入操作的次数;

Com_delete:删除操作的次数;

Com_update:更新操作的次数;



1优化查询

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

       首先要对查询语句进行分析,分析查询语句的命令是EXPLAIN语句和DESCRIBE语句。比如 EXPLAIN SELECT * FROM student  \G;

       索引可以快速定位表中的某条记录。使用索引也可以提高数据库查询的速度,从而提高数据库的性能。如果不使用索引,查询语句将 表中的所有字段。这样查询的速度会很慢。如果使用了索引,查询语句只会查询索引字段。这样就减少查询的记录数,达到提高查询效率的目的。

       现在看一个查询语句中没有索引的使用情况:

SELECT * FROM student  WHERE name = ‘张三’;这样会对student表中的所有数据都查询一下,对比一下name的字段是否是张三。

       然后我们在name字段上建立一个名为index_name的索引:

CREATE INDEX index_name ON student(name);

现在name字段上面已经有索引了,再进行该select语句查询的速度就非常快了,不需要遍历整个表。

       但是有些时候即使查询时使用的是索引,但索引并没有起作用。比如使用了LIKE关键字进行查询时,如果匹配字符串的第一个字符为‘%’,索引不会被使用。如果‘%’不是在第一个位置,索引就会被使用。

       另一种情况是在表的多个字段上创建一个索引,比如

CREATE INDEX index ON student(birth,department);这样只有查询语句条件中使用字段name时,索引才会被用到。因为name字段是多列索引的第一个字段,只有查询条件中使用了name字段才会使索引index起作用。



2优化子查询

       很多查询中需要使用子查询。子查询可以使查询语句很灵活,但子查询的执行效率不高。MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句在临时表中查询记录。查询完毕后,MySQL需要插销这些临时表。所以在MySQL中可以使用连接查询来代替子查询。连接查询不需要建立临时表,其速度比子查询要快。



3优化数据库结构

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

       有些表在设计时设置了很多的字段。但是这个表中的有些字段的使用频率很低。当这个表的数据量很大时,查询数据的速度就会很慢。对于这种字段特别多的并且有字段的使用频率不高的表,就可以将其分解成多个表。

       2增加中间表

       有时需要经常查询某两个表中的几个字段。如果经常进行联表查询,就会降低MySQL数据库的查询速度。对于这种情况可以建立中间表来提高查询速度。

       先分析经常需要同时查询那几个表中的那些字段。然后将这些字段建立一个中间表,并将原来那几个表的数据插入到中间表中,之后就可以使用中间表来进行查询和统计了。

       3增加冗余字段

       设计数据库表时尽量让表达到三范式。但是,有时为了提高查询速度,可以有意识的在表中增加冗余字段。表的规范程度越高,表与表之间的关系就越多,查询时可能经常需要在多个表之间进行连接查询,而进行连接查询会降低查询速度。比如,学生的信息存储在student表中,院系的信息存储在department表中,通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中拿到dept_id字段,然后根据这个编号去department表中查找系的名称。如果需要经常需要进行这个操作的话,连接查询会浪费很多时间。因此可以在student表中增加一个冗余字段dept_name,这样就不用每次都进行连接查询了。其实就是一切以业务为主。

       4优化插入记录的速度

       插入记录时,索引和唯一性校验都会影响到插入记录的速度。而且,一次插入多条记录和多次插入一条记录所消耗的时间是不一样的。根据这些情况,分别进行不同的优化。

       禁用索引:插入记录时,MySQL会根据表的索引对插入的记录进行排序。如果插入大量数据时,这些排序会降低插入的速度。为了解决这种情况,在插入记录之前先禁用索引。等插入之后再启用索引。对于新创建的表,可以先不创建索引,等记录都导入以后再创建索引。这样可以提高导入数据的速度。

       ALTER TABLE 表名 DISABLE KEYS;

       ALTER TABLE 表名 ENABLE KEYS;



       优化INSERT语句:当大量插入数据时,建议使用一个INSERT语句插入多条记录,而不是使用多次INSERT语句。这样可以减少与数据库之间的连接等操作。

       5分析表,检查表,和优化表

分析表的主要作用是分析关键字的分布。检查表的作用是检查表是否存在错误。优化表主要作用是消除删除或者更新造成的空间浪费。

       分析表   ANALYZE TABLE 表名;  使用ANALYZE TABLE分析表的过程中,数据库系统会对表加一个只读锁。在分析表的过程中,只能读取表的内容,不能插入和更新表的内容。ANALYZE TABLE 语句能够分析InnoDB和MyISAM类型的表。

       检查表使用CHECK TABLE语句。在执行过程中也会给表加上只读锁。

       优化表使用OPTIMIZE TABLE语句。只能优化表中的VARCHAR,BLOB,TEXT类型的字段。OPTIMIZE TABLE语句可以消除删除和更新造成的磁盘碎片,从而减少空间浪费。因为如果一个表使用了TEXT或者BLOB这样的数据类型,那么更新,删除等操作就会造成磁盘空间的浪费。因为,更新和删除操作以后,以前分配的磁盘空间不会自动回收。使用OPTIMIZE TABLE语句可以将这些磁盘碎片整理出来,以便再利用。



4 优化MySQL服务器

       硬件上的优化:增加内存和提高磁盘读写速度,都可以提高MySQL数据库的查询,更新的速度。另一种提高MySQL性能的方式是使用多块磁盘来存储数据。因为可以从多块磁盘上并行读取数据,这样可以提高读取数据的速度。

       MySQL参数的优化:内存中会为MySQL保留部分的缓冲区。这些缓冲区可以提高MySQL的速度。缓冲区的大小都是在MySQL的配置文件中进行设置的。

       下面对几个重要的参数进行详细介绍:

key_buffer_size:表示索引缓存的大小。这个值越大,使用索引进行查询的速度就越快
table_cache:表示同时打开的表的个数。这个值越大,能同时打开的表的个数就越多。这个值不是越大越好,因为同时打开的表过多会影响操作系统的性能。
query_cache_size:表示查询缓冲区的大小。使用查询缓存区可以提高查询的速度。这个方式只使用与修改操作少且经常执行相同的查询操作的情况;默认值是0.
Query_cache_type:表示查询缓存区的开启状态。0表示关闭,1表示开启。
Max_connections:表示数据库的最大连接数。这个连接数不是越大越好,因为连接会浪费内存的资源。
Sort_buffer_size:排序缓存区的大小,这个值越大,排序就越快。
Innodb_buffer_pool_size:表示InnoDB类型的表和索引的最大缓存。这个值越大,查询的速度就会越快。这个值太大了就会影响操作系统的性能。


合理配置这些参数可以提高MySQL数据库的性能。配置完参数后,需要重启MySQL服务才会生效。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [mysql 性能优化] 推荐:

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

Mysql性能优化

- - 数据库 - ITeye博客
MySQL性能优化.   性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间. 性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等.   数据库管理人员可以使用SHOW STATUS语句来查询MySQL数据库的性能. 语法:SHOW STATUE LIKE ‘value’;其中value参数是常用的几个统计参数.

mysql性能优化教程

- coolzsb - caoz的和谐blog

[转]MySQL性能优化

- -
  IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段.   2.降低 CPU 计算.   除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了.

MySQL insert性能优化

- - Rebill's Blog
对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是插入时间长. 我们就有一个业务系统,每天的数据导入需要4-5个钟. 这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情. 因此,提高大数据量系统的MySQL insert效率是很有必要的. 经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考.

MySQL性能优化必备25条

- Quantum - ITeye论坛最新讨论
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显. 关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能. 这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.

mysql性能优化脚本mysqltuner.pl

- - 开心平淡对待每一天。热爱生活
 无意中发现了,major哥们开发的一个性能分析脚本,很有意思,可以通过这个脚本学学他的思想. 官方站点: http://blog.mysqltuner.com/get-involved/.

MySQL学习笔记 8 -性能优化

- - CSDN博客数据库推荐文章
SHOW STATUS LIKE ‘value'; 查询MySQL数据库的性能. Connections:连接MySQL服务器的次数. Uptime:MySQL服务器的上线时间. Slow_queries:慢查询的次数. Com_lelect:查询操作的次数. Com_insert:插入操作的次数.

【转载】mysql 性能优化方案

- - 数据库 - ITeye博客
文章来自: http://www.2cto.com/database/201107/96550.html. 内容简介:这是一篇关于mysql 性能优化的文章. 网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化.

浅谈MySQL 数据库性能优化

- - BlogJava-qileilove
数据库是 IO 密集型的程序,和其他数据库一样,主要功能就是数据的持久化以及数据的管理. 本文侧重通过优化MySQL 数据库缓存参数如查询缓存,表缓存,. 日志缓存,索引缓存,innodb缓存,插入缓存,以及连接参数等方式来对MySQL数据库进行优化.   这里先引用一句话,从内存中读取一个数据的时间消耗是微秒级别,而从普通硬盘上读取一个数据是在毫秒级别,二者相差3个数量级.