zoukankan      html  css  js  c++  java
  • MySQL调优2

    如何调优SQL的基础上,继续学习MySQL调优技术。

    MySQL调优的维度

     在三角形的底部,成本越低。如业务需求。

    2、测试数据准备

    下载 https://github.com/datacharmer/test_db 测试数据

    cd /home/files/test_db-master

    执行 mysql -uroot -pxxx < employees.sql 

    检查导入是否正常

     mysql -uroot -pxxx -t < test_employees_md5.sql

    [root@VM_0_13_centos test_db-master]# mysql -uroot -pxxx -t < test_employees_md5.sql
    mysql: [Warning] Using a password on the command line interface can be insecure.
    +----------------------+
    | INFO                 |
    +----------------------+
    | TESTING INSTALLATION |
    +----------------------+
    +--------------+------------------+----------------------------------+
    | table_name   | expected_records | expected_crc                     |
    +--------------+------------------+----------------------------------+
    | departments  |                9 | d1af5e170d2d1591d776d5638d71fc5f |
    | dept_emp     |           331603 | ccf6fe516f990bdaa49713fc478701b7 |
    | dept_manager |               24 | 8720e2f0853ac9096b689c14664f847e |
    | employees    |           300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
    | salaries     |          2844047 | fd220654e95aea1b169624ffe3fca934 |
    | titles       |           443308 | bfa016c472df68e70a03facafa1bc0a8 |
    +--------------+------------------+----------------------------------+
    +--------------+------------------+----------------------------------+
    | table_name   | found_records    | found_crc                        |
    +--------------+------------------+----------------------------------+
    | departments  |                9 | d1af5e170d2d1591d776d5638d71fc5f |
    | dept_emp     |           331603 | ccf6fe516f990bdaa49713fc478701b7 |
    | dept_manager |               24 | 8720e2f0853ac9096b689c14664f847e |
    | employees    |           300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
    | salaries     |          2844047 | fd220654e95aea1b169624ffe3fca934 |
    | titles       |           443308 | bfa016c472df68e70a03facafa1bc0a8 |
    +--------------+------------------+----------------------------------+
    +--------------+---------------+-----------+
    | table_name   | records_match | crc_match |
    +--------------+---------------+-----------+
    | departments  | OK            | ok        |
    | dept_emp     | OK            | ok        |
    | dept_manager | OK            | ok        |
    | employees    | OK            | ok        |
    | salaries     | OK            | ok        |
    | titles       | OK            | ok        |
    +--------------+---------------+-----------+
    +------------------+
    | computation_time |
    +------------------+
    | 00:00:38         |
    +------------------+
    +---------+--------+
    | summary | result |
    +---------+--------+
    | CRC     | OK     |
    | count   | OK     |
    +---------+--------+
    

      

    3、MySQL慢查询

    1) MySQL慢查询参数

    2) MySQL使用方式

    方式二

     这里使用第二种方式

    set global slow_query_log  = 'ON';
    set global log_output = 'FILE,TABLE';
    set global long_query_time = 0.001; --1毫秒 需要重新连接数据库
    show variables like '%long_query_time%' 查看是否生效
    set global log_queries_not_using_indexes = 'ON';


    MySQL慢查询

    select  * from employees
    select * from `mysql`.slow_log;
    可以看到有慢查询日志了

     rows_sent 表示有多少条数据返回客户端。

    rows_examined: 表示这条SQL扫码了多少行。

    显示慢查询文件所在的路径

    show variables like '%slow_query_log_file%'

     路径为:/var/lib/mysql/VM_0_13_centos-slow.log

    查看慢日志文件 more VM_0_13_centos-slow.log

     3、Explian使用

    找到慢SQL后,使用Explian查具体慢的原因

    Explian结果输出字段

    实例1

     type: ALL  全表扫描,性能最差

    key,key_length 为空: 说明没有执行任何索引。

     rows: 扫描行数 2838426

    实例2

    explain
    select * from employees e
    left join salaries s on e.emp_no = s.emp_no
    where e.emp_no = 10001

     结果:

    这里id都是1,从上到下依次执行; 如果id值不同,id值越大,越早执行。

    4、Explain可视化工具

    1) IDEA中,选择SQL语句,右键。选择Explian Plan(Raw)

     4、SQL性能分析

    SQL内部分析性能包括

    SHOW PROFILE

    INFORMATION_SCHEMA.PROFILING

    PERFORMANCE_SCHEMA (MySQL建议使用)

    1) SHOW PROFILE是MySQl的一个性能分析命令,可以跟踪SQL各种资源消耗

    查看是否支持

    SELECT @@have_profiling;

     

     YES说明支持。

    查看是否开启

    select @@profiling;

     0说明没有开启

    开启profiling

    set @@profiling = 1;

    默认之后记录15条的历史

    设置历史条数为100 

    set profiling_history_size = 100;

    查看profile

    show profiles;

    查询select * from salaries; 后执行show profiles;

     可以发现Query_ID 为49.

    查询这条SQL的执行过程 show profile for query 49;

     可以发现这个步骤执行时间最久。 Sending data 0.000745

    查询这条SQL内存执行信息

    show profile memory for query 49;

    查询各种各样的信息

    show profile ALL for query 49;

    分析完成之后,关闭profiling

    set @@profiling = 0;

    MySQL官方文档声明SHOW PROFILE已被废弃,并建议使用Performance Schema作为替代。

    2)  INFORMATION_SCHEMA.PROFILING

    打开profiling 

    set @@profiling = 1;

    执行SQL 

    select * from salaries;

    查看Query_ID为125  show profiles;

    显示profile

    select STATE, format(DURATION,6) AS DURATION
    FROM information_schema.PROFILING
    WHERE  QUERY_ID = 125 ORDER BY SEQ  

    显示结果如下:

    3) PERFORMANCE_SCHEMA 

     查看是否开启 

    select * from performance_schema.setup_actors;

     默认是开启的。任意主机发过来的请求,任意用户,任意角色都开启了。

    只监控指定用户执行的SQL(实际项目建议使用)

     执行如下SQL,开启监控项

    UPDATE performance_schema.setup_instruments
    SET ENABLED  = 'YES', TIMED = 'YES'
    WHERE NAME LIKE '%statement/%';
    
    UPDATE performance_schema.setup_instruments
    SET ENABLED  = 'YES', TIMED = 'YES'
    WHERE NAME LIKE '%stage/%';
    
    
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED  = 'YES'
    WHERE NAME LIKE '%events_statements_%';
    
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED  = 'YES'
    WHERE NAME LIKE '%events_stages_%';
    

    使用开启监控的用户,执行SQL语句,比如:

    SELECT * FROM salaries

      

    执行如下SQL,获得语句EVENT_ID

    select EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000, 6) AS DURATION, SQL_TEXT
    FROM performance_schema.events_statements_history_long
    where SQL_TEXT LIKE '%salaries%'
    

      结果如下图:

    分析执行的SQL语句

    select event_name as Stage, TRUNCATE(TIMER_WAIT/1000000000000, 6) AS DURATION
    FROM performance_schema.events_statements_history_long
    where NESTING_EVENT_ID = 400
    

      

    4) 三种方式对比

    SHOW PROFILE    简单,方便,已废弃。

    INFORMATION_SCHEMA.PROFILING  和SHOW PROFILE  本质是一样的 (已废弃)

    PERFORMANCE_SCHEMA (MySQL建议使用) 目前来说使用不够方便。

    如何选择: 目前可以继续使用SHOW PROFILE 

    6、OPTIMIZER_TRACE  优化器跟踪

    跟踪优化器做出的各种决策

     了解优化器的执行细节

    理解SQL的执行过程,进而优化SQL

     开启 optimizer_trace 

     set optimizer_trace = "enabled=on", end_markers_in_json = on;

    记录最近30条SQL语句

    set optimizer_trace_offset = -30, optimizer_trace_limit = 30;

    执行需要分析的SQL语句

    select *
    from salaries
    where from_date = '1986-06-26'
    and to_date = '1987-06-26'

    使用如下语句分析

    select * from information_schema.OPTIMIZER_TRACE limit 30

    7、SQL诊断命令

    如果数据库出了问题,应该如何定位呢,下面介绍常用的SQL诊断命令

    1) 查看当前正在运行的线程

    show [FULL] processlist

    几个information_schema表常用的操作

     

    2)  查看服务器相关信息

    show status

    3) 查看MySQL的变量

    show variables;

    4)  查看表以及视图的状态

    show table status

    5) 查看索引相关信息

    show INDEX from employees;

    查看表employees的索引信息

  • 相关阅读:
    P4146 序列终结者(Splay树)
    P2617 Dynamic Rankings(树套树)
    P4168 [Violet]蒲公英(分块魔术)
    P3649[APIO2014]回文串(回文自动机)
    [IOI2011]Race(树上启发式合并)
    CentOS 7安装 .net core 环境 官网说明地址
    宝塔 Linux 面板php.ini文件在哪个目录
    KPPW部署一直提示No input file specified的Apache伪静态设置
    【分享】 MPSoC的VCU超频
    Versal AIE 上手尝鲜 2 -- Linux例程
  • 原文地址:https://www.cnblogs.com/linlf03/p/14189599.html
Copyright © 2011-2022 走看看