当前位置:首页 > 开发 > 数据库 > 正文

MySQL性能优化

发表于: 2015-07-02   作者:bijian1013   来源:转载   浏览:
摘要:         性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:         a.优化查询         b.优化数据库结构  

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

        a.优化查询

        b.优化数据库结构

        c.优化MySQL服务器

 

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

        Connections:连接MySQL服务器的次数

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

        Slow_queries:慢查询的次数;

        Com_select:查询操做的次数;

        Com_insert:插入操作的次数;

        Com_delete:删除操作的次数;

        Com_update:更新操作的次数。

 

一.优化查询

        查询操作是最频繁的操作,提高了查询速度可以有效提高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(name,department);这样只有查询语句条件中使用字段name时,索引才会被用到。因为name字段是多列索引的第一个字段,只有查询条件中使用了name字段才会使索引index起作用。

 

二.优化子查询

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

 

三.优化数据库结构

        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语句可以将这些磁盘碎片整理出来,以便再利用。

 

四.优化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服务才会生效。

MySQL性能优化

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
复制(Replication):通过复制执行过的语句或者数据集从主服务器上复制到一个或多个从服务器上实现
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,
1、分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分
按照从大到小,从主要到次要的形式,分析 mysql 性能优化点,达到最终优化的效果。 利用 mindmanger
查询的基础知识 MySQL查询过程如下图所示: MySQL是通过查询语句的哈希查找来命中缓存的,需要注意
当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性
  1. 为查询缓存优化你的查询   大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,
1. 为查询缓存优化你的 sql query 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号