Mysql 查询优化

优化流程:先找出sql语句慢的原因,然后explain sql找出慢的原因,最后进行优化

1. 开启查询日志

Linux下修改mysql配置文件

1. 找到mysql安装目录

which mysql

2. 查找配置文件目录

/usr/bin/mysql --verbose --help | grep -A 1 'Default options'

输出:

fault options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf 

这个信息的意思是: 
服务器首先读取的是/etc/mysql/my.cnf文件,如果前一个文件不存在则继续读/etc/my.cnf文件,如若还不存在便会去读~/.my.cnf文件

打开 /etc/mysql/my.cnf 

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

 成功找到配置文件目录为 /etc/mysql/mysql.conf.d/mysqld.cnf

 mysql数据文件和日志默认储存位置 /var/lib/mysql

 

开启查询日志

  • 普通查询日志:

  在mysql命令行或者客户端管理工具中执行:SHOW VARIABLES LIKE "general_log%";

结果:

    general_log OFF
    general_log_file /var/lib/mysql/localhost.log

  OFF说明没有开启日志记录

  分别执行开启日志以及日志路径和日志文件名

   SET GLOBAL general_log_file = '/var/lib/mysql/localhost.log';
   SET GLOBAL general_log = 'ON';  

注意

  此时为动态配置,重启后失效

永久开启日志记录:

打开mysql配置文件,找到并启用下面配置

#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1

 

 

  • 开启开启慢查询 : 

    查看慢查询开启状态

show variables like "%slow%"
+---------------------------+--------------------------------+
| Variable_name             | Value                          |
+---------------------------+--------------------------------+
| log_slow_admin_statements | OFF                            |
| log_slow_slave_statements | OFF                            |
| slow_launch_time          | 2                              |
| slow_query_log            | OFF                            |
| slow_query_log_file       | /var/lib/mysql/ubuntu-slow.log |
+---------------------------+--------------------------------+

    slow-query-log=1 --开启慢查询

            slow_query_log_file="103-54-slow.log" --慢查询日志文件名,默认跟data目录相同路径
            long_query_time=1 --超过1s认为是慢查询

  • 开启未使用索引SQL过滤配置:

            log_queries_not_using_indexes 

  直接在配置文件中添加这一行就行或者:

            log_queries_not_using_indexes =1

  重启mysql  /etc/init.d/mysql restart

 

2 . show profiles 使用分析sql 性能

mysql> set profiling=1; //开启临时表
mysql> show profiles;    //显示临时表
mysql> show profile for query 2;    //显示某条sql具体执行时间

 


 

优化点

  • 避免获取过多的行和列
  • 重复查询相同的数据,可是使用缓存
  • 合理的使用索引
  •  将耗时长的查询语句分解成多次执行,缓解服务器压力,例如删除1000万条数据,可以一次删除1000条
  • 将一条关联语句分解成多条SQL执行
    • 提高缓存效率
    • 减少mysql表的竞争
  • 关联查询优化
    • 确保 on 后面字段有建立索引
  • 尽量避免使用子查询  

转载于:https://www.cnblogs.com/xiaoliwang/p/8965607.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值