zoukankan      html  css  js  c++  java
  • Mysql之系统参数篇

    Mysql之系统参数篇

    1.MySQL的binlog日志

    二进制有两个最重要的使用场景:
    其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
    其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。

    二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

    1.开启binlog日志
    vi编辑打开mysql配置文件
        # vi /usr/local/mysql/etc/my.cnf
        在[mysqld] 区块
        设置/添加 log-bin=mysql-bin  确认是打开状态(值 mysql-bin 是日志的基本名或前缀名);
        重启mysqld服务使配置生效	
    2.查看二进制日志是否已开启
    mysql> show variables like 'log_%'; 
    log_bin                                | ON                    | ------> ON表示已经开启binlog日志
    3.常用binlog日志操作命令
       1.查看所有binlog日志列表
          mysql> show master logs;
        2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
          mysql> show master status;
        3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
          mysql> flush logs;
          注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
        4.重置(清空)所有binlog日志
          mysql> reset master;
    

    2.MySQL查看数据库安装路径

    查看mysql 数据库的安装目录在哪里:

    # 以下两个sql任意一个可查询
    select @@basedir as basePath from dual ;
    show variables like '%basedir%';
    

    查看数据库data的路径:

    # 以下查询任意一个均可
    select @@datadir as dataPath from dual ;
    show variables Like '%datadir%';
    

    3.Mysql开启慢查询日志

    查看是否开启:

    mysql> 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/hadoop127-slow.log |
    +---------------------------+-----------------------------------+
          slow_query_log 默认是off关闭的,使用时,需要改为on 打开      
    
          slow_query_log_file 记录的是慢日志的记录文件
    
          long_query_time 默认是10S,每次执行的sql达到这个时长,就会被记录
    打开慢查询 : SET GLOBAL slow_query_log = ON;
    将默认时间改为1S: SET GLOBAL long_query_time = 1;
    

    配置文件慢查询日志开启:

    #vim /etc/my.cnf
    #慢查询sql日志设置
    #slow_query_log = 1
    #slow_query_log_file = /data/mysqldata/slow.log
    #检查未使用到索引的sql
    #log_queries_not_using_indexes = 1
    #针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数
    #log_throttle_queries_not_using_indexes = 5
    #作为从库时生效,从库复制中如何有慢sql也将被记录
    #log_slow_slave_statements = 1
    #慢查询执行的秒数,必须达到此值可被记录
    #long_query_time = 8
    #检索的行数必须达到此值才可被记为慢查询
    #min_examined_row_limit = 100
    

    重启数据库

    4.Mysql Explain详解

    explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。
    explain 分析sql语句
    使用explain关键字可以模拟优化器执行sql查询语句,从而得知MySQL 是如何处理sql语句。

    +----+-------------+-------+------------+------+---------------+-----+---------+------+------+----------+-------+
    | id | select_type | table | partitions | type | possible_keys | key | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-------+------------+------+---------------+-----+---------+------+------+----------+-------+
    

    id
    select 查询的序列号,包含一组可以重复的数字,表示查询中执行sql语句的顺序。一般有三种情况:
    第一种:id全部相同,sql的执行顺序是由上至下;
    第二种:id全部不同,sql的执行顺序是根据id大的优先执行;
    第三种:id既存在相同,又存在不同的。先根据id大的优先执行,再根据相同id从上至下的执行。

    select_type
    select 查询的类型,主要是用于区别普通查询,联合查询,嵌套的复杂查询
    simple:简单的select 查询,查询中不包含子查询或者union
    primary:查询中若包含任何复杂的子查询,最外层查询则被标记为primary
    subquery:在select或where 列表中包含了子查询
    derived:在from列表中包含的子查询被标记为derived(衍生)MySQL会递归执行这些子查询,把结果放在临时表里。
    union:若第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select将被标记为:derived
    union result:从union表获取结果的select

    partitions
    表所使用的分区,如果要统计十年公司订单的金额,可以把数据分为十个区,每一年代表一个区。这样可以大大的提高查询效率。

    type
    这是一个非常重要的参数,连接类型,常见的有:all , index , range , ref , eq_ref , const , system , null 八个级别。
    性能从最优到最差的排序:system > const > eq_ref > ref > range > index > all
    对java程序员来说,若保证查询至少达到range级别或者最好能达到ref则算是一个优秀而又负责的程序员。
    all:(full table scan)全表扫描无疑是最差,若是百万千万级数据量,全表扫描会非常慢。
    index:(full index scan)全索引文件扫描比all好很多,毕竟从索引树中找数据,比从全表中找数据要快。
    range:只检索给定范围的行,使用索引来匹配行。范围缩小了,当然比全表扫描和全索引文件扫描要快。sql语句中一般会有between,in,>,< 等查询。
    ref:非唯一性索引扫描,本质上也是一种索引访问,返回所有匹配某个单独值的行。比如查询公司所有属于研发团队的同事,匹配的结果是多个并非唯一值。
    eq_ref:唯一性索引扫描,对于每个索引键,表中有一条记录与之匹配。比如查询公司的CEO,匹配的结果只可能是一条记录,
    const:表示通过索引一次就可以找到,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快,若将主键至于where列表中,MySQL就能将该查询转换为一个常量。
    system:表只有一条记录(等于系统表),这是const类型的特列,平时不会出现,了解即可

    possible_keys
    显示查询语句可能用到的索引(一个或多个或为null),不一定被查询实际使用。仅供参考使用。

    key
    显示查询语句实际使用的索引。若为null,则表示没有使用索引。

    key_len
    显示索引中使用的字节数,可通过key_len计算查询中使用的索引长度。在不损失精确性的情况下索引长度越短越好。key_len 显示的值为索引字段的最可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。

    ref
    显示索引的哪一列或常量被用于查找索引列上的值。

    rows
    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,值越大越不好。
    extra
    Using filesort: 说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序” 。出现这个就要立刻优化sql。
    Using temporary: 使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和 分组查询 group by。 出现这个更要立刻优化sql。
    Using index: 表示相应的select 操作中使用了覆盖索引(Covering index),避免访问了表的数据行,效果不错!如果同时出现Using where,表明索引被用来执行索引键值的查找。如果没有同时出现Using where,表示索引用来读取数据而非执行查找动作。
    覆盖索引(Covering Index) :也叫索引覆盖,就是select 的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select 列表中的字段,而不必根据索引再次读取数据文件。
    Using index condition: 在5.6版本后加入的新特性,优化器会在索引存在的情况下,通过符合RANGE范围的条数 和 总数的比例来选择是使用索引还是进行全表遍历。
    Using where: 表明使用了where 过滤
    Using join buffer: 表明使用了连接缓存
    impossible where: where 语句的值总是false,不可用,不能用来获取任何元素
    distinct: 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。

    使用force index 强制指定索引

    mysql> explain select * from itdragon_order_list force index(idx_order_levelDate) order by order_level,input_date;
    

    5.临时表

    TmpTable的状况主要是用于监控MySQL使用临时表的量是否过多,是否有临时表过大而不得不从内存中换出到磁盘文件上。

    mysql> show global status like 'created_tmp%';
    +-------------------------+----------+
    | Variable_name           | Value    |
    +-------------------------+----------+
    | Created_tmp_disk_tables | 3188656  |
    | Created_tmp_files       | 29968    |
    | Created_tmp_tables      | 24477865 |
    +-------------------------+----------+
    

    从上面的状态信息可以了解到系统使用了24477865次临时表,其中有3188656次临时表比较大,无法在内存中完成,而不得不使用到磁盘文件。如果Created_tmp_tables非常大 ,则可能是系统中排序操作过多,或者是表连接方式不是很优化。而如果是Created_tmp_disk_tables与Created_tmp_tables的比率过高,如超过10%,则我们需要考虑是否tmp_table_size这个系统参数所设置的足够大。当然,如果系统内存有限,也就没有太多好的解决办法了。
    每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:
    Created_tmp_disk_tables / Created_tmp_tables * 100% <=25%
    配置文件配置临时表空间

    #vim /etc/my.cnf
    #内部内存临时表的最大值 ,设置成128M。
    #比如大数据量的group by ,order by时可能用到临时表,
    #超过了这个值将写入磁盘,系统IO压力增大
    #tmp_table_size = 134217728
    

    MySQL服务器对临时表的配置:

    mysql> show variables where Variable_name in('tmp_table_size', 'max_heap_table_size');
    +---------------------+----------+
    | Variable_name       | Value    |
    +---------------------+----------+
    | max_heap_table_size | 16777216 |
    | tmp_table_size      | 16777216 |
    +---------------------+----------+
    
  • 相关阅读:
    佛学的经典 —— 《妙色王求法偈》
    dom4j的用法
    Android真机网络adb联机调试初探
    CString的部分实现剖析
    文件下载:"Content-disposition","attachment; filename=中文名>>>解决方案
    内存块重叠的判断方法
    闭包
    Twenty Newsgroups Classification任务之二seq2sparse(5)
    IE 加速插件之 Google Chrome Frame
    [Android面试题-7] 写出一个Java的Singleton类(即单例类)
  • 原文地址:https://www.cnblogs.com/Alicebat/p/13502165.html
Copyright © 2011-2022 走看看