• SQL性能分析1


    mySQL性能测试

    MySQL数据库介绍:

             主流分支:

                       MariaDb

    1. MySql之父windenius创建,目标在于替换现有MySQl
    2. 兼容MySQl,对于开发者来说感知不到变化
    3. MariaDB is free and open source software

    MySQl数据库重点监控指标:

             QPS:

      1. Queries per seconds 每秒钟查询数量
      2. Show global status like ‘Question%’
      3. Queries/seconds

    TPS:

      1. Tranaction per seconds
      2. TPS = (Com_commit + Com_rollback)/seconds
      3. Show global status like ‘Com_commit’;
      4. Show global status like ‘Com_rollback’

    线程连接数:

    1. Show global status like’Max_used_connections’;
    2. Show global status like’Threads%’;
    3. Show variables like ‘max_connections’;

    Query Cache:

    1. 查询缓存用于缓存select查询结果
    2. 当下次接收到相同查询请求时,不再执行实际查询处理而直接返回结果
    3. 适用于大量查询,很少改变表中数据
    4. 修改my.cnf
    5. 将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M
    6. 增加一行:query_cache_type = 0/1/2
    7. 如果设置为1,将缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存
    8. 如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询
    9. Show status like ‘Qcache%’;
    10. Query_cache_hits = (Qcache_hits/(Qcache_hits+Qcache_inserts))*100%

    锁定状态:

    1. Show global status like ‘%lock%’
    2. Table_locks_waited/Table_locks_immediate 值越大代表表锁造成的阻塞越严重
    3. Innodb_row-lock-waits innodb行锁,太大可能是间隙锁造成的

    主从延时:

    1. 查询主从延时时间: show slave status

    慢查询定义:

    1. 执行速度超过定义的时间的查询
    2. 不同的系统定义不同的慢查询指标

    慢查询开启:

    1. 编辑/etc/my.cnf, 在[mysqld]域中添加:
    2. 开启慢查询: show_query_log = 1
    3. 慢查询日志路径: slow_query_log_file = /data/mysql/slow.log
    4. 慢查询的时长: long-query_time= 1
    5. 未使用索引的查询也被记录到慢查询日志中
    6. log_queries_not_using_indexes = 1

    慢查询日志分析:

             Mysqldumpslow命令

    1. -s 是表示按照何种方式排序

    a)         –s –c : 访问计数

    b)         –s –l : 锁定时间

    c)         –s – r : 返回记录

    d)         –s –t : 查询时间

    e)         –s –al : 平均锁定时间

    f)          –s -ar : 平均返回记录

    g)         –s –at: 平均查询时间

    1. –t 是top n的意思,即为返回前面多少条的数据
    2. –g 后边可以写一个正则匹配模式,大小写是不敏感的

    慢查询分析举例:

             得到返回记录集最多的10个SQL

      1. Mysqldumpslow –s r –t 10 slow.log

    得到访问次数最多的10个SQL

      1. Mysqldumpslow –s c –t 10 slow.log

    得到按照时间排序的前10条里面含有左链接的查询语句

      1. Mysqldumpslow –s t –t 10 –g “left join” slow.log

    SQl语句性能分析:

             Explain执行计划:

      1. 用法explain select 语句

             Explain结果分析:

                       Id:

        1. Id: select识别符,代表语句的执行顺序,一般在select嵌套查询时会不同
        2. Id列数字越大越先执行,如果说数字一样大,那么就从上往下一次执行
        3. Id列为null的就表示这是一个结果集,不需要使用它来进行查询

    Select_type:

    1. Simple: 表示不需要union操作或者不包含子查询的简单select查询,有连接查询时,外层的查询为simple,且只有一个
    2. Primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary,且只有一个
    3. Union: union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
    4. Dependent union:与union一样,出现在union或union all语句中,但是这个查询要受到外部查询的影响
    5. Union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
    6. Subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
    7. Dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
    8. Derived: from子句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select
    9. Table: 显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null; 如果显示为尖括号括起来的<derived N>就表示这个是临时表
    10. Type:从好到差依次是:sytem, const, eq_ref, ref, fulltext, ref_or_null, unique_subquery, index_subquery, range, index_merge, index, ALL
    11. Type:除了all之外,其他的type都可以使用到索引,除了index-merge之外,其他的type只可以用到一个索引
    12. Type中的:

    a)         System: 表中只有一行数据或者是空表,且只能用于myisam和memory表, 如果是Innodb引擎表, type列在这个情况通常都是all或者index

    b)         Const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const,其他数据库也叫做唯一索引扫描

    c)         eq_ref:出现在要连接多个表的查询计划中,驱动表只返回一行数据, 且这行数据是第二个表的主键或者唯一索引,且必须为not null, 唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref

    d)         ref: 不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找,或者多列主键,唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现

    e)         fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引

    f)          ref_or_null:与ref方法类似,只是增加了null值的比较,实际用的不多

    g)         unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值

    h)         index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重

    i)           range:索引范围扫描,常见于使用>,<,is null, between, in, like,等运算符的查询中

    j)           index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and, or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由与要读取多个索引,性能可能大部分时间不如range

    k)         index:索引全表扫描,把索引从头到尾扫描一遍,常见于使用索引列就可以处理不需要读取数据文件的查询,可以使用索引排序或者分组查询

    l)           all:这个就是全表扫描数据文件,然后在server层进行过滤返回符合要求的记录

  • 相关阅读:
    判断整除
    洛谷2018-7月月赛
    luogu_P1177 【模板】快速排序 (快排和找第k大的数)
    lowbit() 运算
    64位整数乘法 (二进制思想)
    poj_1995 Raising Modulo Numbers (快速幂)
    poj_3179 Corral the Cows (二分+二维前缀和+离散化)
    Spring-profile 不同环境配置方法
    Spring-id,name 名称,别名关系
    Leecode no.20 合理的括号
  • 原文地址:https://www.cnblogs.com/jiyanjiao-702521/p/12613901.html
Copyright © 2020-2023  润新知