zoukankan      html  css  js  c++  java
  • mysql性能分析

    索引

    普通索引

    Index(xx) 或者 key(xx)

    MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

    唯一索引

    UNIQUE INDEX UniqIdx(xx)

    索引列中的值必须是唯一的,但是允许为空值

    主键索引

    PRIMARY KEY(id)

    是一种特殊的唯一索引,不允许有空值。

    组合索引

    INDEX MultiIdx(id, name, age)

    在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。

    全文索引

    只有在MyISAM引擎上才能使用,略

    空间索引

    只有在MyISAM引擎上才能使用,略

    覆盖索引

    定义:如果索引包含满足查询的所有数据,就称为覆盖索引。

    MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提高了效率。

    当使用到了覆盖索引,使用EXPLAIN可以在Extra一列中看到“Using index”

    一般配合组合索引生效(查询的字段是组合索引中的字段)

    MySQL性能医生:orzdba

    安装

    先装各种perl相关的依赖包和控件

    $ yum install -y perl-Test-Simple.x86_64 perl-Time-HiRes perl-ExtUtils-CBuilder
    $ yum install -y perl-ExtUtils-MakeMaker perl-DBD-MySQL perl-DBI perl-Module-Build
    

    注意my.cnf的配置,否则连不上

    [mysqld]
    略略略
    socket=/home/apps/mysql/mysql.sock
    
    # 需要增加以下配置,socket设置为[mysqld]下的数值
    [client]
    default-character-set=utf8
    socket=/home/apps/mysql/mysql.sock
    
    [mysql]
    default-character-set=utf8
    socket=/home/apps/mysql/mysql.sock
    

    添加环境变量(实现免密码快速登录mysql)export MYSQL_PWD='hll@123'

    设置orzdba可执行权限即可chmod 755 orzdba

    使用

    $ ./orzdba -h
    
    ==========================================================================================
    Info  :
            Created By zhuxu@taobao.com
    Usage :
    Command line options :
    
       -h,--help           Print Help Info.
       -i,--interval       Time(second) Interval.
       -C,--count          Times.
       -t,--time           Print The Current Time.
       -nocolor            Print NO Color.
    
       -l,--load           Print Load Info.
       -c,--cpu            Print Cpu  Info.
       -s,--swap           Print Swap Info.
       -d,--disk           Print Disk Info.
       -n,--net            Print Net  Info.
    
       -P,--port           Port number to use for mysql connection(default 3306).
       -S,--socket         Socket file to use for mysql connection.
    
       -com                Print MySQL Status(Com_select,Com_insert,Com_update,Com_delete).
       -hit                Print Innodb Hit%.
       -innodb_rows        Print Innodb Rows Status(Innodb_rows_inserted/updated/deleted/read).
       -innodb_pages       Print Innodb Buffer Pool Pages Status(Innodb_buffer_pool_pages_data/free/dirty/flushed)
       -innodb_data        Print Innodb Data Status(Innodb_data_reads/writes/read/written)
       -innodb_log         Print Innodb Log  Status(Innodb_os_log_fsyncs/written)
       -innodb_status      Print Innodb Status from Command: 'Show Engine Innodb Status'
                           (history list/ log unflushed/uncheckpointed bytes/ read views/ queries inside/queued)
       -T,--threads        Print Threads Status(Threads_running,Threads_connected,Threads_created,Threads_cached).
       -rt                 Print MySQL DB RT(us).
       -B,--bytes          Print Bytes received from/send to MySQL(Bytes_received,Bytes_sent).
    
       -mysql              Print MySQLInfo (include -t,-com,-hit,-T,-B).
       -innodb             Print InnodbInfo(include -t,-innodb_pages,-innodb_data,-innodb_log,-innodb_status)
       -sys                Print SysInfo   (include -t,-l,-c,-s).
       -lazy               Print Info      (include -t,-l,-c,-s,-com,-hit).
    
       -L,--logfile        Print to Logfile.
       -logfile_by_day     One day a logfile,the suffix of logfile is 'yyyy-mm-dd';
                           and is valid with -L.
    
    Sample :
       shell> nohup ./orzdba -lazy -d sda -C 5 -i 2 -L /tmp/orzdba.log  > /dev/null 2>&1 &
    ==========================================================================================
    
    # 输出到文件
    $ nohup ./orzdba -lazy -d sda -C 5 -i 2 -L /tmp/orzdba.log  > /dev/null 2>&1 &
    

    慢查询日志配置

    慢查询相关参数查看:

    $ SHOW VARIABLES LIKE 'slow_query%';
    $ SHOW VARIABLES LIKE 'long_query_time';
    

    直接修改配置文件:

    # 是否开启慢查询日志
    slow_query_log=1
    # 指定保存路径及文件名,默认为数据文件目录,
    slow_query_log_file=/home/logs/mysql/mysql-slow.log
    # 指定多少秒返回查询的结果为慢查询
    long_query_time=1
    # 记录所有没有使用到索引的查询语句
    log_queries_not_using_indexes=1
    # 记录那些由于查找了多于1000行而引发的慢查询
    min_examined_row_limit=1000
    # 记录那些慢的管理语句:optimize table,analyze table和alter table语句
    log_slow_admin_statements=1
    # 记录由Slave所产生的慢查询
    log_slow_slave_statements=1
    

    或命令行方式修改:

    $ set global slow_query_log=1;
    $ set global slow_query_log_file=/home/logs/mysql/mysql-slow.log;
    $ set long_query_time=1;
    $ set global log_queries_not_using_indexes=1;
    $ set global min_examined_row_limit=1000;
    $ set global log_slow_admin_statements=1;
    $ set global log_slow_slave_statements=1;
    

    常用分析命令

    缓存

    # 缓存相关参数查看
    $ SHOW VARIABLES LIKE '%query_cache%';
    
    # 查看缓存命中情况
    $ show status like '%qcache%';
    
    # 关闭/开启缓存(特定性能测试中为避免走到缓存可以先关闭)
    # 动态修改:
    $ set global query_cache_size=0;
    $ set global query_cache_type=0;
    # 或my.cnf配置修改:
    query_cache_type=0
    query_cache_size=0
    
    # 直接指定用/不用缓存
    Select sql_no_cache count(*) from pythonlearn.lianjia;
    Select count(*) from pythonlearn.lianjia;
    

    表状态

    # 显示哪些进程正在运行,可以杀掉进程,如:kill 1825;
    # 显示前100条
    $ SHOW PROCESSLIST;
    # 显示所有
    $ SHOW FULL PROCESSLIST;
    
    # 显示哪些表的打开的
    $ SHOW OPEN TABLES;
    # In_use列表示有多少线程正在使用某张表
    # Name_locked表示表名是否被锁,这一般发生在Drop或Rename命令操作这张表时
    

    事务

    # 查询正在执行的事务
    SELECT * FROM information_schema.INNODB_TRX
    
    # 查看正在锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
    
    # 查看等待锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
    

    查看正在执行的sql

    只能看到正在执行的select * from information_schema.PROCESSLIST where info is not null;

    查看完整的

    # 1. 开启日志
    $ SET GLOBAL log_output = 'TABLE';
    $ SET GLOBAL general_log = 'ON';
    
    # 2. 查询日志
    $ SELECT * from mysql.general_log ORDER BY event_time DESC;
    
    $ 3. 清空表(这个表不允许使用delete,只能用truncate)
    $ truncate table mysql.general_log;
    
    # 4. 最后记得关闭
    $ SET GLOBAL general_log = 'OFF';
    

    其他

    # 修改密码
    # 查看密码复杂度
    $ SHOW VARIABLES LIKE 'validate_password%';
    # 修改密码验证等级
    $ SET GLOBAL validate_password_policy=LOW;
    # 密码最小长度限制修改(最小是4)
    $ SET GLOBAL validate_password_length=6;
    
    # 允许远程连接:
    $ GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

    配置优化

  • 相关阅读:
    【刷题】BZOJ 1061 [Noi2008]志愿者招募
    【比赛】NOIP2017 列队
    react_app 项目开发 (6)_后台服务器端-node
    react_app 项目开发 (5)_前后端分离_后台管理系统_开始
    react_app 项目开发 (3)_单页面设计_react-router4
    react_app 项目开发 (2)_axios_pubsub-js
    react_app 项目开发
    React_基本原理_ajax
    React_生命周期
    组件化
  • 原文地址:https://www.cnblogs.com/CSunShine/p/13558843.html
Copyright © 2011-2022 走看看