mysql5.6版本的优化

1. 目标

l 了解什么是优化mysql

l 掌握优化查询的方法sql

l 掌握优化数据库结构的方法数据库

l 掌握优化MySQL服务器的方法服务器

2. 什么是优化?

l 合理安排资源、调整系统参数使MySQL运行更快、更节省资源。多线程

l 优化是多方面的,包括查询、更新、服务器等。数据库设计

l 原则:减小系统瓶颈,减小资源占用,增长系统的反应速度。函数

3. 数据库性能参数

l 使用SHOW STATUS语句查看MySQL数据库的性能参数性能

  • SHOW STATUS LIKE 'value‘

l 经常使用的参数:优化

  • Slow_queries  慢查询次数
  • Com_(CRUD) 操做的次数
  • Uptime  上线时间

 

SHOW STATUS LIKE ‘Slow_queries‘spa

SHOW STATUS LIKE ‘Com_insert‘

SHOW STATUS LIKE ‘Com_delete‘

SHOW STATUS LIKE ‘Com_update‘

 

4. 查询优化

4.1. EXPLAIN

MySQL中可使用EXPLAIN查看SQL执行计划,用法:EXPLAIN SELECT * FROM tb_item

 

 

 

4.2. 结果说明

4.2.1. id

SELECT识别符。这是SELECT查询序列号。这个不重要。

4.2.2. select_type

表示SELECT语句的类型

 

有如下几种值

一、 SIMPLE
表示简单查询其中不包含链接查询和子查询

二、 PRIMARY
表示主查询或者是最外面的查询语句

 

 

三、 UNION
表示链接查询的第2个或后面的查询语句。

 

 

四、 DEPENDENT UNION
UNION中的第二个或后面的SELECT语句,取决于外面的查询。

五、 UNION RESULT
链接查询的结果

六、 SUBQUERY
子查询中的第1SELECT语句。

 

 

七、 DEPENDENT SUBQUERY
子查询中的第1SELECT语句,取决于外面的查询。

八、 DERIVED
SELECT(FROM 子句的子查询)

4.2.3. table

表示查询的表

4.2.4. type重要的是否须要优化的排除手段

表示表的链接类型

如下的链接类型的顺序是从最佳类型到最差类型

 

一、 system
表仅有一行,这是const类型的特列,平时不会出现,这个也能够忽略不计。

二、 const
数据表最多只有一个匹配行,由于只匹配一行数据,因此很快,经常使用于PRIMARY KEY或者UNIQUE索引的查询,可理解为const是最优化的

 

 

三、 eq_ref
mysql手册是这样说的:"对于每一个来自于前面的表的行组合,从该表中读取一行。这多是最好的联接类型,除了const类型。它用在一个索引的全部部分被联接使用而且索引是UNIQUEPRIMARY KEY"eq_ref能够用于使用=比较带索引的列。

 

 

四、 ref
查询条件索引既不是UNIQUE也不是PRIMARY KEY的状况ref可用于=<>操做符的带索引的列。

 

 

五、 ref_or_null
该联接类型如同ref,可是添加了MySQL能够专门搜索包含NULL值的行。在解决子查询中常用该联接类型的优化。

 

上面这五种状况都是很理想的索引使用状况。

下面的必需要优化

六、 index_merge
该联接类型表示使用了索引合并优化方法。在这种状况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。

七、 unique_subquery
该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery是一个索引查找函数,能够彻底替换子查询,效率更高。

八、 index_subquery
该联接类型相似于unique_subquery。能够替换IN子查询,但只适合下列形式的子查询中的非惟一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)

九、 range
只检索给定范围的行,使用一个索引来选择行。

 

 

十、 index
该联接类型与ALL相同,除了只有索引树被扫描。这一般比ALL,由于索引文件一般比数据文件小。

十一、 ALL
对于每一个来自于先前的表的行组合,进行完整的表扫描。(性能最差)

4.2.5. possible_keys

指出MySQL能使用哪一个索引在该表中找到行。

若是该列为NULL,说明没有使用索引能够对该列建立索引来提升性能

4.2.6. key

显示MySQL实际决定使用的键(索引)。若是没有选择索引,键是NULL

能够强制使用索引或者忽略索引

 

 

 

4.2.7. key_len

显示MySQL决定使用的键长度。若是键是NULL,则长度为NULL

 

注意:key_len是肯定了MySQL将实际使用的索引长度

 

4.2.8. ref

显示使用哪一个列或常数与key一块儿从表中选择行。

4.2.9. rows

显示MySQL认为它执行查询时必须检查的行数。

4.2.10. Extra

该列包含MySQL解决查询的详细信息

  • Distinct:MySQL发现第1个匹配行后,中止为当前的行组合搜索更多的行。
  • Not exists:MySQL可以对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,再也不为前面的的行组合在该表内检查更多的行。
  • range checked for each record (index map: #):MySQL没有发现好的可使用的索引,但发现若是来自前面的表的列值已知,可能部分索引可使用。
  • Using filesort:MySQL须要额外的一次传递,以找出如何按排序顺序检索行。
  • Using index:从只使用索引树中的信息而不须要进一步搜索读取实际的行来检索表中的列信息。
  • Using temporary:为了解决查询,MySQL须要建立一个临时表来容纳结果。
  • Using where:WHERE 子句用于限制哪个行匹配下一个表或发送到客户。
  • Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
  • Using index for group-by:相似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,能够用来查 询GROUP BYDISTINCT查询的全部列,而不要额外搜索硬盘访问实际的表。

4.3. 使用索引查询须要注意

索引能够提供查询的速度但并非使用了带有索引的字段查询都会生效有些状况下是不生效的须要注意

4.3.1. 使用LIKE关键字的查询

在使用LIKE关键字进行查询的查询语句中若是匹配字符串的第一个字符为%”,索引不起做用只有%”不在第一个位置,索引才会生效

 

 

4.3.2. 使用联合索引的查询

MySQL能够为多个字段建立索引一个索引能够包括16个字段。对于联合索引,只有查询条件中使用了这些字段中第一个字段时,索引才会生效。

以下表tb_cart中建表是声明2个索引(联合) 顺序是user_id和item_id   

 

 

 

 

4.3.3. 使用OR关键字的查询

查询语句的查询条件中只有OR关键字OR先后的两个条件中的列都是索引时索引才会生效不然索引不生效

 

 

 

 

4.4. 子查询优化

MySQL4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,能够一次完成不少逻辑上须要多个步骤才能完成的SQL操做。

 

子查询虽然很灵活可是执行效率并不高

 

执行子查询时,MYSQL须要建立临时表查询完毕后再删除这些临时表因此子查询的速度会受到必定的影响

 

优化:

可使用链接查询JOIN代替子查询链接查询时不须要创建临时表其速度比子查询快

5. 数据库结构优化

一个好的数据库设计方案对于数据库的性能每每会起到事半功倍的效果

 

须要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。

5.1. 将字段不少的表分解成多个表

对于字段较多的表若是有些字段的使用频率很低能够将这些字段分离出来造成新表

 

由于当一个表的数据量很大时会因为使用频率低的字段的存在而变慢

 

5.2. 增长中间表

对于须要常常联合查询的表能够创建中间表以提升查询效率

 

经过创建中间表将须要经过联合查询的数据插入到中间表中而后将原来的联合查询改成对中间表的查询

5.3. 增长冗余字段

设计数据表时应尽可能遵循范式理论的规约尽量的减小冗余字段让数据库设计看起来精致、优雅。可是,合理的加入冗余字段能够提升查询速度。

 

表的规范化程度越高表和表之间的关系越多须要链接查询的状况也就越多性能也就越差

 

注意:

冗余字段的值在一个表中修改了就要想办法在其余表中更新不然就会致使数据不一致的问题。

6. 插入数据的优化

插入数据时影响插入速度的主要是索引惟一性校验一次插入的数据条数等

 

插入数据的优化不一样的存储引擎优化手段不同,在MySQL经常使用的存储引擎有,MyISAMInnoDB二者的区别

 

 

 

6.1. MyISAM

6.1.1. 禁用索引

对于非空表插入记录时,MySQL会根据表的索引对插入的记录创建索引若是插入大量数据创建索引会下降插入数据速度

 

为了解决这个问题能够在批量插入数据以前禁用索引数据插入完成后再开启索引

 

禁用索引的语句

ALTER TABLE table_name DISABLE KEYS

 

开启索引语句

ALTER TABLE table_name ENABLE KEYS

 

对于空表批量插入数据则不须要进行操做由于MyISAM引擎的表是在导入数据后才创建索引

6.1.2. 禁用惟一性检查

惟一性校验会下降插入记录的速度能够在插入记录以前禁用惟一性检查插入数据完成后再开启

 

禁用惟一性检查的语句SET UNIQUE_CHECKS = 0;

 

开启惟一性检查的语句:SET UNIQUE_CHECKS = 1;

6.1.3. 批量插入数据

插入数据时可使用一条INSERT语句插入一条数据也能够插入多条数据

 

第二种方式的插入速度比第一种方式快

6.1.4. 使用LOAD DATA INFILE

当须要批量导入数据时,使用LOAD DATA INFILE语句INSERT语句插入速度快不少。

6.2. InnoDB

6.2.1. 禁用惟一性检查

用法和MyISAM同样

6.2.2. 禁用外键检查

插入数据以前执行禁止对外键的检查数据插入完成后再恢复,能够提供插入速度。

 

禁用:SET foreign_key_checks = 0;

开启:SET foreign_key_checks = 1;

6.2.3. 禁止自动提交

插入数据以前执行禁止事务的自动提交数据插入完成后再恢复,能够提升插入速度。

 

禁用:SET autocommit = 0;

开启:SET autocommit = 1;

7. 服务器优化

7.1. 优化服务器硬件

服务器的硬件性能直接决定着MySQL数据库的性能硬件的性能瓶颈直接决定MySQL数据库的运行速度和效率

 

须要从如下几个方面考虑

一、 配置较大的内存。足够大的内存,是提升MySQL数据库性能的方法之一。内存的IO比硬盘快的多,能够增长系统的缓冲区容量,使数据在内存停留的时间更长,以减小磁盘的IO

二、 配置高速磁盘,好比SSD

三、 合理分配磁盘IO,把磁盘IO分散到多个设备上以减小资源的竞争提升并行操做能力

四、 配置多核处理器,MySQL是多线程的数据库多处理器能够提升同时执行多个线程的能力

7.2. 优化MySQL的参数

经过优化MySQL的参数能够提升资源利用率从而达到提升MySQL服务器性能的目的

 

MySQL的配置参数都在my.conf或者my.ini文件的[mysqld]组中,经常使用的参数以下:

 

 

 

 

相关文章
相关标签/搜索