mysql性能优化

一、慢查询

1、慢查询日志

是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQl语句的日志,通过定位分析性能的瓶颈,才能更好地优化数据库系统的性能。

2、参数说明

​ (1)slow_query_log:慢查询开启状态

​ (2)slow_query_log_file:慢查询日志存放的位置

​ (3)long_query_time:查询超过多少秒才记录

3、设置步骤

1、查看慢查询相关参数
mysql> show variables like 'slow_query%';#(查看是否开启了慢查询日志,日志保存的位置)
+---------------------+-----------------------------------+
| Variable_name       | Value                             |
+---------------------+-----------------------------------+
| slow_query_log      | OFF                               |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+

mysql> show variables like 'long_query_time';#(查看当超过多少秒时会被记录到日志中去)
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

2、设置方法
#1、开启慢查询,将slow_query_log设置为on状态
mysql> set global slow_query_log='on';
Query OK, 0 rows affected (0.66 sec)

#2、设置慢查询日志存放的位置
mysql> set global slow_query_log_file='/var/lib/mysql/localhost-slow.log';
Query OK, 0 rows affected (0.00 sec)

#3、设置超出时间,当超出指定时间后会被记录到慢查询日志中
mysql> set global long_query_time = 1;
Query OK, 0 rows affected (0.00 sec)

#4、重启MySQL服务
[root@localhost etc]# systemctl restart mysqld

#5、重新登陆后,查看设置后的参数
mysql> show variables like 'slow_query%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| slow_query_log      | ON                             |
| slow_query_log_file | /usr/local/mysql/data/slow.log |
+---------------------+--------------------------------+

mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+

#6、测试
#1)执行一条满查询SQl语句
mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.02 sec)
#2)查看存在该日志,并进行查看
ls /var/lib/mysql/localhost-slow.log

3、慢查询日志解析

  • 第一行:用户名、用户的IP信息、线程ID号
  • 第二行:执行话费的时间(单位:毫秒)
  • 第三行:执行获得锁的时间
  • 第四行:获得的结果行数
  • 第五行:扫描的数据行数
  • 第六行:这SQL执行的具体时间
  • 第七行:具体的SQL语句

4、慢查询分析

慢查询的日志记录非常多,要从里面找寻一条查询慢的日志并不是很容易的事情,一般来说都需要一些工具辅助才能快速定位到需要优化的 SQL 语句。

4.1Mysqldumpshow

mysqldumpshow -s r -t 10 slow-mysql.log -s order (c,t,l,r,at,al,ar);
#c:总次数
#t:总时间
#l:锁的时间
#r:总数据行
#at,al,ar :t,l,r 平均数 【例如:at = 总时间/总次数】
#-t top 指定取前面几条作为结果输出


# 按照时间排序,取出前10条记录
mysqldumpslow -s t -t 10 /usr/local/mysql/data/mysql-slow.log

二、索引

索引是一种可以让SELECT语句提高效率的数据结构,可以起到快速定位的作用。

1、索引的优势和劣势

优势:

  • 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录
  • 通过索引列对数据进行排序,减低数据排序,降低CPU的消耗
    • 被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。
    • 如果按照索引的顺序进行排序,对于order by语句来说,效率会提高很多

劣势:

  • 索引会占据磁盘空间
  • 索引虽然会提高查询效率但会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的所有文件。

2、mysql索引 B+ tree

2.1B+tree定义

  • 数据只存储在叶子节点上,非叶子节点只保存索引信息;

    • 非叶子节点(索引节点)存储的只是一个Flag,不保存实际数据记录;
    • 索引节点指示该节点的左子树比这个Flag小,而右子树大于等于这个Flag;
  • 叶子节点本身按照数据的升序排序进行链接(串联起来)

2.2为什么使用B+数索引而不是用hash索引

  • 因为hash索引不支持范围查找
  • MySQL中hash解决冲突:InnoDB中采用除法散列函数(取余法),冲突机制采用链接法
  • Hash 索引无法做 like ‘xxx%’ 这样的部分模糊查询,因为需要对 完整 key 做 Hash 计算,定位bucket。而 B+tree 索引具有最左前缀匹配,可以进行部分模糊查询