• 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 后面字段有建立索引
    • 尽量避免使用子查询  
  • 相关阅读:
    区块链学习笔记
    Ubuntu下Maven配置与Maven项目创建教程
    Java数字签名——ECDSA算法
    Java数字签名——DSA算法
    Java数字签名——RSA算法
    Python——Web.py詳解
    Flask從入門到入土(五)——Flask与数据库
    Flask從入門到入土(四)——登錄實現
    Flask從入門到入土(三)——Web表單
    Flask從入門到入土(三)——模板
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/8965607.html
Copyright © 2020-2023  润新知