MySQL学习笔记.MySQL性能优化

优化概述

MySQL数据库优化的目的:一方面是为了
找出系统的瓶颈,提高MySQL数据库的性能,另一方面是合理的结构设计和参数调整,用来提高用户操作响应速度,同时还要尽可能节约系统的资源。
MySQL数据库优化是多方面的,原则是减少系统瓶颈,减少资源占用,增加系统的响应速度。可以通过优化文件系统,提高磁盘的读写速度,通过优化操作系统的调度策略增强响应速度。

使用语句:SHOW STATUS LIKE 参数;可以查询MySQL数据库的性能参数
常用的参数有:connections连接MySQL服务器次数,uptimeMySQL服务器上线时间,slow_queries慢查询次数,com_select查询操作的次数,com_insert插入操作的次数,com_update更新操作次数,com_delete删除操作次数。
例:查询连接次数和连接时间

mysql> show status like 'connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections   | 2     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show status like 'uptime';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 390   |
+---------------+-------+
1 row in set (0.00 sec)

优化查询

查询在数据库中是最频繁的操作,如何提高查询速度从而提升mysql的性能?

1.分析查询语句
通过对查询语句的分析,可以了解查询语句的执行情况,这也就可以找到查询语句执行的瓶颈进而去优化。mysql中提供了EXPLAIN和DESCRIBE语句来对查询语句进行分析。
EXPLAIN语法:EXPLAIN [EXTENDED] SELECT select_options
select_options是查询选项,包括FROM WHERE子句
准备数据,首先创建一个名为wb的数据库,创建一个名为student的表并插入数据。

例:分析一下下面这个查询语句

mysql> explain select * from student;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | student | ALL  | NULL          | NULL | NULL    | NULL |   20 |       |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

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

possible_keys:指出MySQL能使用哪个索引在该表中找到行。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看它是否引用某些列或适合索引的列来提高查询性能。如果是这样,可以创建适合的索引来提高查询的性能。

key:表示查询使用到的索引

key_len:表示mysql选择的索引子段按字节计算的长度

ref:表示使用哪个列或常数与索引一起来查询记录

type:表示表的连接类型

DESCRIBE语句和EXPLAIN类似

mysql> explain select * from student where sno='2018001015';
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | student | ALL  | NULL          | NULL | NULL    | NULL |   20 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> desc select * from student where sno='2018001015';
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | student | ALL  | NULL          | NULL | NULL    | NULL |   20 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

2.索引对查询速度的影响
MySQL中提高性能的一个有效方式就是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且可加快查询的速度,因此,索引对查询的速度有着至关重要的影响。使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度、提高数据库的性能。
例:不使用索引和使用索引的对比。
不使用索引

mysql> explain select * from student where sno='2018001015';
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | student | ALL  | NULL          | NULL | NULL    | NULL |   20 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

使用索引

mysql> explain select * from student where sno='2018001015';
+----+-------------+---------+------+---------------+-----------+---------+-------+------+-------------+
| id | select_type | table   | type | possible_keys | key       | key_len | ref   | rows | Extra       |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+-------------+
|  1 | SIMPLE      | student | ref  | index_sno     | index_sno | 33      | const |    1 | Using where |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

可见有索引的话rows=1,无索引的话为20,有索引大大提高了效率。

3.使用索引查询
索引可以提高查询速度,但是也并不是使用索引的字段查询时索引都会起作用,比如以下查询
使用LIKE关键字的查询语句
如果匹配字符串的第一个字符为"%",索引就不会起作用,也就是说"%"只有不在第一个字符时,索引才会起作用。

mysql> CREATE INDEX index_name ON student(sname);
Query OK, 20 rows affected (0.11 sec)
Records: 20  Duplicates: 0  Warnings: 0

mysql> explain select * from student where sname like '%l';
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | student | ALL  | NULL          | NULL | NULL    | NULL |   20 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select * from student where sname like 'l%';
+----+-------------+---------+-------+---------------+------------+---------+------+------+-------------+
| id | select_type | table   | type  | possible_keys | key        | key_len | ref  | rows | Extra       |
+----+-------------+---------+-------+---------------+------------+---------+------+------+-------------+
|  1 | SIMPLE      | student | range | index_name    | index_name | 63      | NULL |    2 | Using where |
+----+-------------+---------+-------+---------------+------------+---------+------+------+-------------+
1 row in set (0.00 sec)

使用多列索引的查询语句
对于多列索引,只有查询条件中使用第一个字段时索引才会被使用,一个索引可包括16个子段。
使用OR关键字查询语句
查询语句条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询中才使用索引。
sno和sname列均是索引

mysql> explain select * from student where sno='2018001015' OR sname='l%';
+----+-------------+---------+-------------+----------------------+----------------------+---------+------+------+------------------------------------------------+
| id | select_type | table   | type        | possible_keys        | key                  | key_len | ref  | rows | Extra                                          |
+----+-------------+---------+-------------+----------------------+----------------------+---------+------+------+------------------------------------------------+
|  1 | SIMPLE      | student | index_merge | index_sno,index_name | index_sno,index_name | 33,63   | NULL |    2 | Using union(index_sno,index_name); Using where |
+----+-------------+---------+-------------+----------------------+----------------------+---------+------+------+------------------------------------------------+
1 row in set (0.00 sec)

4.优化子查询
使用子查询可以进行SELECT语句的嵌套查询,也就是一个SELECT查询结果可以作为另一个SELECT查询的条件,所以子查询也就是说可以一次性完成逻辑上多个步骤才能完成的操作,也因此子查询比较灵活,看起来这种查询方式不错,但是正因为这样所以它的执行效率不高。在mysql中可以使用join查询来代替子查询,连接查询速度要比子查询要快上不少,所以能使用连接查询的尽量不使用子查询。

优化MySQL服务器

优化服务器主要从两个方面进行优化,一方面是对硬件进行优化,另一方面是对mysql服务参数进行优化。

1.硬件优化
硬件是决定数据库性能的关键,直接决定着数据库的运行速度和效率,所以针对性能瓶颈提高硬件配置可以有效提高数据库的性能。
方法一:配置足够大的内存。内存的速度比磁盘快得多,大内存可以增加系统缓冲区容量数据就会在内存停留更长的时间,从而减少磁盘I/O。
方法二:配置高速磁盘系统,减少读盘等待时间,提高响应速度。
方法三:合理分布磁盘I/O,将其分散在多个设备上,减少资源竞争。
方法四:配置多处理器。多处理器可以执行多个线程。

2.优化mysql参数
通过优化mysql参数可以有效提高资源利用率。
mysql服务配置参数都在my.ini文件中
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44862120/article/details/109683541
今日推荐