精华内容
下载资源
问答
  • MySQL参数

    千次阅读 2014-11-30 22:15:11
    MySQL在启动的时候会去加载初始化一系列的参数文件,这些参数动态的决定了MySQL运行时的特性。MySQL中的参数是由一个个键值对(key-value)组成的,可以分为以下两类: 动态参数:可以在MySQL实例运行时改变其...

    MySQL在启动的时候会去加载初始化一系列的参数文件,这些参数动态的决定了MySQL运行时的特性。MySQL中的参数是由一个个键值对(key-value)组成的,可以分为以下两类:

    • 动态参数:可以在MySQL实例运行时改变其value的值。
    • 静态参数:只能在MySQL实例启动的时候进行初始化,运行期间其value是只读的,不可改变。

    MySQL实例在启动的时候是按照一定的顺序去读取这一系列参数文件的,Linux模式下,我们通过以下的命令去查看这些配置文件以及他们读取的先后顺序


    这些文件可能在你的环境中不会存在,但是这并不影响MySQL实例的启动,若有则读之,若没有则自动忽略,倘若这些配置文件都不存在,MySQL还是可以正常的启动,因为它会读取编译时代码中的初始值进行初始化,需要注意的是这些文件中后面的配置文件会覆盖前面的配置文件中key相同项的value。


    查看MySQL实例的参数

    除了可以在配置文件中查看到已经定义了的变量值,在MySQL命令行下,我们可以通过show variables命令查看相关的参数文件。

    比如,我们查看MySQL的error.log文件位置,可以通过下面的方式


    查看MySQL数据文件的地址


    修改配置文件

    我们可以在参数文件中修改那些静态参数,可以在MySQL命令行使用SET命令在运行时修改动态参数。MySQL参数的作用域分为会话级参数(session)全局参数(global),在参数文件中修改的静态参数是对所有的会话都生效的,使用SET命令在运行时设置的参数是可以分为会话级和全局级的,有的参数只能是会话级,比如autocommit参数,有些则只能是全局级的,比如binlog_cache_size参数,而另外的一些则是既可以设置为会话级也可以设为全局级的,比如,read_buffer_size参数。

    在配置文件中修改参数

    [root@localhost etc]# vi /etc/my.cnf
    
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
    # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
    # *** default location during install, and will be replaced if you
    # *** upgrade to a newer version of MySQL.
    
    [mysqld]
    
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    
    # These are commonly set, remove the # and set as required.
    # basedir = .....
    # datadir = .....
    # port = .....
    # server_id = .....
    # socket = .....
    
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    #这里设置两个静态参数
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    
    innodb_purge_threads=2

    在运行时修改动态参数(注意下面这个有趣的列子)

    mysql> show variables like 'autocommit';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | autocommit    | ON    |
    +---------------+-------+
    1 row in set (0.00 sec)
    
    mysql> set global autocommit=0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show variables like 'autocommit';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | autocommit    | ON    |
    +---------------+-------+
    1 row in set (0.00 sec)
    
    mysql> set session autocommit=0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show variables like 'autocommit';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | autocommit    | OFF   |
    +---------------+-------+
    1 row in set (0.00 sec)

    因为autocommit参数只是会话级的,所以当强制把它设置为全局有效时,语句可以正常的执行但是autocommit的值并不会改变,当使用session级别时,方可设置生效,当然,当不加session或global的时候,默认是session。但是,对于那些即可设置全局生效,有可设置当前会话生效的参数,不加域限制,默认只在当前会话生效,比如,下面的例子

    mysql> select @@session.read_buffer_size\G
    *************************** 1. row ***************************
    @@session.read_buffer_size: 131072
    1 row in set (0.15 sec)
    
    mysql> select @@global.read_buffer_size\G
    *************************** 1. row ***************************
    @@global.read_buffer_size: 131072
    1 row in set (0.00 sec)
    
    mysql> set read_buffer_size=524288;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> select @@session.read_buffer_size\G
    *************************** 1. row ***************************
    @@session.read_buffer_size: 524288
    1 row in set (0.00 sec)
    
    mysql> select @@global.read_buffer_size\G
    *************************** 1. row ***************************
    @@global.read_buffer_size: 131072
    1 row in set (0.00 sec)

    这里使用了 select @@session 和 select @@global方式进行查看会话参数和全局参数,同样可以使用set @@global和set @@session进行设置全局和会话参数。

    如果在运行期间改变静态参数会直接报错,因为它们是只读的。

    mysql> set @@global.datadir='/root/mysql';
    ERROR 1238 (HY000): Variable 'datadir' is a read only variable


    展开全文
  • mysql参数

    千次阅读 2011-12-09 09:40:37
    linux下mysql配置文件my.cnf详解【转】 basedir = path 使用给定目录作为根目录(安装目录)。 character-sets-dir = path 给出存放着字符集的目录。 datadir = path 从给定目录读取...
     
    

    linux下mysql配置文件my.cnf详解【转】

    basedir = path 使用给定目录作为根目录(安装目录)。
    character-sets-dir = path 给出存放着字符集的目录。
    datadir = path 从给定目录读取数据库文件。
    pid-file = filename 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。
    socket = filename 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。在Windows环境下,如果MySQL客户与服务器是通过命名管道进行通信 的,–sock选项给出的将是该命名管道的名字(默认设置是MySQL)。
    lower_case_table_name = 1/0 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。

     

    mysqld程序:语言设置

    character-sets-server = name 新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容,这个字符集也可以用–default-character-set选项给出; 但这个选项已经显得有点过时了。
    collation-server = name 新数据库或数据表的默认排序方式。
    lanuage = name 用指定的语言显示出错信息。

     

    mysqld程序:通信、网络、信息安全

    enable-named-pipes 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL,但可以用–socket选项来改变。
    local-infile [=0] 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。
    myisam-recover [=opt1, opt2, ...] 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。
    old-passwords 使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。
    port = n 为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。
    safe-user-create 只有在mysql.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。
    shared-memory 允许使用内存(shared memory)进行通信(仅适用于Windows)。
    shared-memory-base-name = name 给共享内存块起一个名字(默认的名字是MySQL)。
    skip-grant-tables 不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。
    skip-host-cache 不使用高速缓存区来存放主机名和IP地址的对应关系。
    skip-name-resovle 不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。
    skip-networking 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接,不允许ICP/IP连接; 这提高了安全性,但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。
    user = name mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用–user=mysql选项来启动mysqld程序。

     

    mysqld程序:内存管理、优化、查询缓存区

    bulk_insert_buffer_size = n 为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。
    key_buffer_size = n 用来存放索引区块的RMA值(默认设置是8M)。
    join_buffer_size = n 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。
    max_heap_table_size = n HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。
    max_connections = n MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。
    query_cache_limit = n 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。
    query_cache_size = n 查询缓存区的最大长度(默认设置是0,不开辟查询缓存区)。
    query_cache_type = 0/1/2 查询缓存区的工作模式:0, 禁用查询缓存区; 1,启用查询缓存区(默认设置); 2,”按需分配”模式,只响应SELECT SQL_CACHE命令。
    read_buffer_size = n 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。
    read_rnd_buffer_size = n 类似于read_buffer_size选项,但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。
    sore_buffer = n 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小,则必须创建一个临时文件来进行排序。
    table_cache = n 同时打开的数据表的数量(默认设置是64)。
    tmp_table_size = n 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。

     

    mysqld程序:日志

    log [= file] 把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。
    log-slow-queries [= file] 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机 名)。
    long_query_time = n 慢查询的执行用时上限(默认设置是10s)。
    long_queries_not_using_indexs 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同–log-slow-queries选项)。
    log-bin [= filename] 把对数据进行修改的所有SQL命令(也就是INSERT、UPDATE和DELETE命令)以二进制格式记入日志(二进制变更日志,binary update log)。这种日志的文件名是filename.n或默认的hostname.n,其中n是一个6位数字的整数(日志文件按顺序编号)。
    log-bin-index = filename 二进制日志功能的索引文件名。在默认情况下,这个索引文件与二进制日志文件的名字相同,但后缀名是.index而不是.nnnnnn。
    max_binlog_size = n 二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前,MySQL服务器会自动提供一个新的二进制日志文件接续上。
    binlog-do-db = dbname 只把给定数 据库里的变化情况记入二进制日志文件,其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况,就必须在配置文件使用多个本选项来设置,每个数据库一行。
    binlog-ignore-db = dbname 不把给定数据库里的变化情况记入二进制日志文件。
    sync_binlog = n 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0,意思是由操作系统来负责二进制日志文件的同步工作。
    log-update [= file] 记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数,MySQL会使用hostname.err作为种日志文件的名字。

     

    mysqld程序:镜像(主控镜像服务器)

    server-id = n 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。
    log-bin = name 启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n,其中的n是一个6位数字的整数(日志文件顺序编号)。
    binlog-do/ignore-db = dbname 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。

     

    mysqld程序:镜像(从属镜像服务器)

    server-id = n 给服务器分配一个唯一的ID编号
    log-slave-updates 启用从属服务器上的日志功能,使这台计算机可以用来构成一个镜像链(A->B->C)。
    master-host = hostname 主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件),它将忽略此选项。
    master-user = replicusername 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件,它将忽略此选项。
    master-password = passwd 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件,它将忽略此选项。
    master-port = n 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。
    master-connect-retry = n 如果与主控服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件,它将忽略此选项。
    master-ssl-xxx = xxx 对主、从服务器之间的SSL通信进行配置。
    read-only = 0/1 0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。
    read-log-purge = 0/1 1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。
    replicate-do-table = dbname.tablename 与–replicate-do-table选项的含义和用法相同,但数据库和数据库表名字里允许出现通配符”%” (例如: test%.%–对名字以”test”开头的所有数据库里的所以数据库表进行镜像处理)。

     

    replicate-do-db = name 只对这个数据库进行镜像处理。
    replicate-ignore-table = dbname.tablename 不对这个数据表进行镜像处理。
    replicate-wild-ignore-table = dbn.tablen 不对这些数据表进行镜像处理。
    replicate-ignore-db = dbname 不对这个数据库进行镜像处理。
    replicate-rewrite-db = db1name > db2name 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。
    report-host = hostname 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关–主控服务器可以用这条命令生成一份从属服务器的名单。
    slave-compressed-protocol = 1 主、从服务器使用压缩格式进行通信–如果它们都支持这么做的话。
    slave-skip-errors = n1, n2, …或all 即使发生出错代码为n1、n2等的错误,镜像处理工作也继续进行(即不管发生什么错误,镜像处理工作也继续进行)。如果配置得当,从属服务器不应该在执行 SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用slave-skip-errors选项,从属服务器上的镜像工作就可能因为发生错误而中断,中断后需要有人工参与才能继续进行。

     

    mysqld–InnoDB:基本设置、表空间文件

    skip-innodb 不加载InnoDB数据表驱动程序–如果用不着InnoDB数据表,可以用这个选项节省一些内存。
    innodb-file-per-table 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。
    innodb-open-file = n InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了innodb-file-per-table选项并且需要同时打开很多数据表的话,这个数字很可能需要加大。
    innodb_data_home_dir = p InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。
    innodb_data_file_path = ts 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。例如,ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB,ibdata2的最大长度也是1G,但允许它扩充到2GB。除文件名外,还可以用硬盘分区的设置名来定义表 空间,此时必须给表空间的最大初始长度值加上newraw关键字做后缀,给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。
    innodb_autoextend_increment = n 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件,那些文件的增大速度相对是比较小的。
    innodb_lock_wait_timeout = n 如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。
    innodb_fast_shutdown 0/1 是否以最快的速度关闭InnoDB,默认设置是1,意思是不把缓存在INSERT缓存区的数据写入数据表,那些数据将在MySQL服务器下次启动时再写入 (这么做没有什么风险,因为INSERT缓存区是表空间的一个组成部分,数据不会丢失)。把这个选项设置为0反面危险,因为在计算机关闭时,InnoDB 驱动程序很可能没有足够的时间完成它的数据同步工作,操作系统也许会在它完成数据同步工作之前强行结束InnoDB,而这会导致数据不完整。

     

    mysqld程序:InnoDB–日志

    innodb_log_group_home_dir = p 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。
    innodb_log_files_in_group = n 使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后,之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单 位进行设置。
    innodb_flush_log_at_trx_commit = 0/1/2 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。
    innodb_flush_method = x InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync,用fsync()函数进行同步; O_DSYNC,用O_SYNC()函数进行同步。
    innodb_log_archive = 1 启用InnoDB驱动程序的archive(档案)日志功能,把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与 MySQL一起使用时没有多大意义(启用MySQL服务器的二进制日志功能就足够用了)。

     

    mysqld程序–InnoDB:缓存区的设置和优化

    innodb_log_buffer_pool_size = n 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响,如果计算机上只运行有 MySQL/InnoDB数据库服务器,就应该把全部内存的80%用于这个用途。

     

    innodb_log_buffer_size = n 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。
    innodb_additional_men_pool_size = n 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。
    innodb_file_io_threads = n I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。
    innodb_thread_concurrency = n InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。

     

    mysqld程序:其它选项

    bind-address = ipaddr MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址,这个选项将非常重要。
    default-storage-engine = type 新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。
    default-timezone = name 为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。
    ft_min_word_len = n 全文索引的最小单词长度工。这个选项的默认设置是4,意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。
    Max-allowed-packet = n 客户与服务器之间交换的数据包的最大长度,这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。
    Sql-mode = model1, mode2, … MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括ansi、db2、 oracle、no_zero_date、pipes_as_concat。

     

    注意:如果在配置文件里给出的某个选项是mysqld无法识别的,MySQL服务器将不启动。

    展开全文
  • Mysql性能优化、Mysql参数优化、Mysql配置优化。Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能的得到最佳的效果 Mysql参数优化...

    码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071

    Mysql性能优化、Mysql参数优化、Mysql配置优化。Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能的得到最佳的效果

    更多MySQL缓冲区配置优化参考:https://success.blog.csdn.net/article/details/97396807

    Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能的得到最佳的效果

    为了测试我们创建一个test1的库创建一个tb1的表,然后导入2万行数据

    mysql> select count(*) from test1.tb1;
    +----------+
    | count(*) |
    +----------+
    | 20000 |
    +----------+
    1 row in set (0.15 sec)</span>

    在手动插入一条其他数据。

    mysql> insert into test1.tb1 values(20001,admin,12322112123332,1999-1-1,2019-9-1,ppppppppppp); 
    Query OK, 1 row affected (0.00 sec)

    在没有优化之前我们使用mysqlslap来进行压力测试

    \
    我们可以看到没有优化之前,它所用的时间为41.761秒,接下来开始我们的配置优化

    下面列出了对性能优化影响较大的主要变量,主要分为连接请求的变量和缓冲区的变量

    1) 连接请求的变量

    Max_connections

    Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,当然这是要建立在机器能够支撑的情况下,因为如果连接数越来越多,mysql会为每个连接提供缓冲区,就会开销的越多的内存,所以需要适当的调整该值,不能随便去提高设值。

    Mysql>show variables like '%max_connections%';
    Mysql>show status like '%max_user_connections%';

    如果max_used_connections跟max_connections相同那么就是max_connections设置过低或者超过服务器的负载上限了,低于10%则设置过大

    1.首先查看mysql默认的最大连接数(默认为151)

    mysql> show variables like "max_connections%";
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | max_connections | 151 |
    +-----------------+-------+
    1 row in set (0.02 sec)

    修改/etc/my.cnf在[mysqld]下添加以下内容,设置最大连接数为1024,重启mysql服务验证

    Max_connections=1024

    查看修改后的最大连接数

    mysql> show variables like "max_connections%";
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | max_connections | 1024 |
    +-----------------+-------+
    1 row in set (0.00 sec)

    2)back_log

    mysql能暂存的连接数量,当主要mysql线程在一个很短时间内得到非常多的连接请求时候它就会起作用,如果mysql的连接数据达到max_connections时候,新来的请求将会被存在堆栈中,等待某一连接释放资源,该推栈的数量及back_log,如果等待连接的数量超过back_log,将不被授予连接资源

    back_log值指出在mysql暂时停止回答新请求之前的短时间内有多少个请求可以被存在推栈中,只有如果期望在一个短时间内有很多连接的时候需要增加它

    当我们在观察主机进程列表

    mysql>show full processlist

    发现大量的待连接进程时,就需要加大back_log或者加大max_connections的值

    可以通过以下命令查看back_log的设置

    >mysql> show variables like '%back_log%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | back_log | 254 |
    +---------------+-------+
    1 row in set (0.00 sec)

    修改/etc/my.cnf文件在[mysqld]下添加如下内容,设置最大连接数为1024,随后重启mysql服务再次查看

    mysql> show variables like '%back_log%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | back_log | 1024 |
    +---------------+-------+
    1 row in set (0.00 sec)

    3)wait_timeout和interactive_timeout

    wait_timeout:指的是mysql在关闭一个非交互的连接之前所要等待的秒数
    interactive_timeoutz:指的是mysql在关闭一个交互的连接之前所需要等待的秒数,比如我们在终端上进行mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时间就会自动的断开,默认的是28800,可调优为7200。wait_timeout:如果设置太小,那么连接关闭的就很快,从而使一些持久的连接不起作用
    如果设置太大,容易造成连接打开时间过长,在show processlist时候,能看到很多的连接 一般希望wait_timeout尽可能低

    查看wait_timeout和interactive_timeout的设置

    mysql> show variables like "%wait_timeout%";
    mysql> show variables like "%interactive_timeout%";

    \

    修改/etc/my.cnf,添加以下内容

    wait_timeout=100
    interactive_timeout=100

    重启mysql服务,再次查看

    \

    4)key_buffer_size
    key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度,通过key_read_requests和key_reads可以直到key_baffer_size设置是否合理。
    可以通过show status like "key_read%"查看

    mysql> show variables like "key_buffer_size%";
    +-----------------+---------+
    | Variable_name | Value |
    +-----------------+---------+
    | key_buffer_size | 8388608 |
    +-----------------+---------+
    1 row in set (0.00 sec)
    mysql> show status like "key_read%";
    +-------------------+-------+
    | Variable_name | Value |
    +-------------------+-------+
    | Key_read_requests | 6 |
    | Key_reads | 3 |
    +-------------------+-------+
    2 rows in set (0.01 sec)

    一共有6个索引读取请求,有三个请求在内存中没有找到直接从硬盘中读取索引

    key_buffer_size只对myisam表起作用,即使不使用myisam表,但是内部的临时磁盘表是myisam表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知

    mysql> show status like "created_tmp%";
    +-------------------------+-------+
    | Variable_name | Value |
    +-------------------------+-------+
    | Created_tmp_disk_tables | 0 |
    | Created_tmp_files | 5 |
    | Created_tmp_tables | 0 |
    +-------------------------+-------+
    3 rows in set (0.00 sec)

    默认配置数值是8388608我主机有2个G内存那么可调优为134217728(128MB)
    可以修改主配置文件添加如下内容

    key_buffer_size=128M

    重启mysql服务后再次查看

    5)query_cache_size(查询缓存简称QC)
    使用查询缓冲,mysql将查询结果存放在缓冲区中,今后对于同样的select语句(区分大小写),将直接从缓冲区中读取结果。
    一个sql查询如果以select开头,那么mysql服务器将尝试对其使用查询缓存。
    注:两个sql语句,只要想差哪怕是一个字符(列如大小写不一样;多一个空格等),那么这两个sql将使用不同的一个cache。
    上述状态值可以使用show status like &#39;Qcache%获得&#39;

    mysql> show status like "%Qcache%";
    +-------------------------+---------+
    | Variable_name | Value |
    +-------------------------+---------+
    | Qcache_free_blocks | 1 |
    | Qcache_free_memory | 1031832 |
    | Qcache_hits | 0 |
    | Qcache_inserts | 0 |
    | Qcache_lowmem_prunes | 0 |
    | Qcache_not_cached | 0 |
    | Qcache_queries_in_cache | 0 |
    | Qcache_total_blocks | 1 |
    +-------------------------+---------+
    8 rows in set (0.00 sec)

    Qcache_free_blocks:缓存中相邻内存块的个数。如果该值显示较大,则说明Query Cache 中的内存碎片较多了,FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
    注:当一个表被更新之后,和它相关的cache blocks将被free。但是这个block依然可能存在队列中,除非是在队列的尾部。可以用FLUSH QUERY CACHE语句来清空free blocks
    Qcache_free_memory:Query Cache 中目前剩余的内存大小。通过这个参数我们可以较为准确的观察出当前系统中的Query Cache 内存大小是否足够,是需要增加还是过多了。
    Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
    Qcache_inserts:表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。
    Qcache_lowmem_prunes:多少条Query 因为内存不足而被清除出Query Cache。通过“Qcache_lowmem_prunes”和“Qcache_free_memory”相互结合,能够更清楚的了解到我们系统中Query Cache 的内存大小是否真的足够,是否非常频繁的出现因为内存不足而有Query 被换出。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的free_blocks和free_memory可以告诉您属于哪种情况)
    Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
    Qcache_queries_in_cache:当前Query Cache 中cache 的Query 数量;
    Qcache_total_blocks:当前Query Cache 中的block 数量;。
    我们再查询一下服务器关于query_cache的配置:


    \

    上图可以看出query_cache_type为off表示不缓存任何查询

    各字段的解释:
    query_cache_limit:超过此大小的查询将不缓存
    query_cache_min_res_unit:缓存块的最小大小 ,query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
    query_cache_size:查询缓存大小 (注:QC存储的最小单位是1024 byte,所以如果你设定了一个不是1024的倍数的值,这个值会被四舍五入到最接近当前值的等于1024的倍数的值。)

    query_cache_type:缓存类型,决定缓存什么样的查询,注意这个值不能随便设置,必须设置为数字,可选项目以及说明如下:

    如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。

    如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。

    如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。

    修改/etc/my.cnf,配置完后的部分文件如下:

    query_cache_size=256M

    query_cache_type=1

    保存文件,重新启动MYSQL服务,然后通过如下查询来验证是否真正开启了:

    \

    6)max_connect_errors是一个mysql中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码等情况,当超过指定次数,mysql服务器将禁止host的连接请求,直到mysql服务器重启或通过flush hosts命令清空此host的相关信息 max_connect_errors的值与性能并无太大关系。
    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容
    max_connect_errors=20

    修改完后重启mysql服务

    7)sort_buffer_size
    每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY 或GROUP BY操作,Sort_Buffer_Size并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。列如:500个连接将会消耗500*sort_buffer_size(2M)=1G内存
    修改/etc/my.cnf文件,在[mysqld]下面添加如下:

    sort_buffer_size=2M

    8)max_allowed_packet=32M
    mysql根据配置文件会限制,server接受的数据包大小。有时候大的插入和更新会受max_allowed_packet参数限制,导致写入或者更新失败,更大值是1GB,必须设置1024的倍数

    9)join_buffer_size=2M
    用于表间关联缓存的大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。

    10)thread_cache_size = 300
    服务器线程缓存,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时,那么客户端的线程将被放到缓存中以响应下一个客户而不是销毁(前提是缓存数未达上限),如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。设置规则如下:1GB 内存配置为8,2GB配置为16,3GB配置为32,4GB或更高内存,可配置更大。服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)

    \

    试图连接到MySQL(不管是否连接成功)的连接数

    >mysql> show status like '%threads_%';
    +-------------------+-------+
    | Variable_name | Value |
    +-------------------+-------+
    | Threads_cached | 0 |
    | Threads_connected | 1 |
    | Threads_created | 1 |
    | Threads_running | 1 |
    +-------------------+-------+
    4 rows in set (0.00 sec)

    Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
    Threads_connected :代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。
    Threads_created :代表从最近一次服务启动,已创建线程的数量,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值。
    Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态。

    11.innodb_buffer_pool_size

    对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。

    mysql> show variables like '%innodb_buffer_pool_size%';

    设置innodb_buffer_pool_size

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容

    innodb_buffer_pool_size = 2048M

    重启MySQL Server进入后,查看设置已经生效。

    12. innodb_flush_log_at_trx_commit

    主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。

    实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。

    根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。

    13.innodb_thread_concurrency = 0
    此参数用来设置innodb线程的并发数量,默认值为0表示不限制,若要设置则与服务器的CPU核数相同或是cpu的核数的2倍,建议用默认设置,一般为8.

    14.innodb_log_buffer_size

    此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,对于较大的事务,可以增大缓存大小。

    innodb_log_buffer_size=32M

    15. innodb_log_file_size = 50M

    此参数确定数据日志文件的大小,以M为单位,更大的设置可以提高性能.

    16. innodb_log_files_in_group = 3

    为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3

    17.read_buffer_size = 1M
    MySql 读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。和 sort_buffer_size一样,该参数对应的分配内存也是每个连接独享

    18.read_rnd_buffer_size = 16M
    MySql 的随机读(查询操作)缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。
    注:顺序读是指根据索引的叶节点数据就能顺序地读取所需要的行数据。随机读是指一般需要根据辅助索引叶节点中的主键寻找实际行数据,而辅助索引和主键所在的数据段不同,因此访问方式是随机的。

    19.bulk_insert_buffer_size = 64M
    批量插入数据缓存大小,可以有效提高插入效率,默认为8M

    20.binary log

    log-bin=/usr/local/mysql/data/mysql-bin

    binlog_cache_size = 2M //为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存, 提高记录bin-log的效率。没有什么大事务,dml也不是很频繁的情况下可以设置小一点,如果事务大而且多,dml操作也频繁,则可以适当的调大一点。前者建议是--1M,后者建议是:即 2--4M

    max_binlog_cache_size = 8M //表示的是binlog 能够使用的最大cache 内存大小

    max_binlog_size= 512M //指定binlog日志文件的大小,如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志。你不能将该变量设置为大于1GB或小于4096字节。默认值是1GB。在导入大容量的sql文件时,建议关闭sql_log_bin,否则硬盘扛不住,而且建议定期做删除。

    expire_logs_days = 7 //定义了mysql清除过期日志的时间。

    二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。

    mysqladmin flush-logs 也可以重新开始新的binarylog

    相关优化参数总结:

    slow_query_log=1
    slow_query_log_file = /usr/local/mysql/data/slow_query_log
    long_query_time=1
    log-queries-not-using-indexes
    max_connections=1024
    back_log=128
    wait_timeout=60
    interactive_timeout=7200
    key_buffer_size=256M
    query_cache_size=256M
    query_cache_type=1
    query_cache_limit=50M
    max_connect_errors=20
    sort_buffer_size=2M
    max_allowed_packet=32M
    join_buffer_size=2M
    thread_cache_size=200
    innodb_buffer_pool_size=2048M
    innodb_flush_log_at_trx_commit=1
    innodb_log_buffer_size=32M
    innodb_log_file_size=128M
    innodb_log_files_in_group=3
    log-bin=mysql-bin
    binlog_cache_size=2M
    max_binlog_cache_size=8M
    max_binlog_size=512M
    expire_logs_days=7
    read_buffer_size=1M
    read_rnd_buffer_size=16M
    bulk_insert_buffer_size=64M
    server-id=1

    优化结束后,再次进行压力测试,查看效果

    \

     

     

     

    展开全文
  • MySql参数优化

    千次阅读 2016-03-17 17:36:10
    MySql参数优化 windows系统配置文件在xxx\MySQL\MySQL Server 下 my.ini show global status可以列出mysql服务器运行各种状态值, show variables 查询mysql服务器配置信息语句: 慢查询 ...

    MySql参数优化

    windows系统配置文件在xxx\MySQL\MySQL Server 下 my.ini

    show global status可以列出mysql服务器运行各种状态值,

    show variables 查询mysql服务器配置信息语句:

    慢查询

    mysql> show variables like ‘slow%’;

    variable_name value
    log_slow_queries on
    slow_launch_time 2

    mysql> show global status like ‘slow%’;

    variable_name value
    slow_launch_threads 0
    slow_queries 4148

    配置中打开了记录慢查询,执行时间超过2秒的即为慢查询,系统显示有4148个慢查询,你可以分析慢查询日志,找出有问题的sql语句,慢查询时间不宜设置过长,否则意义不大,最好在5秒以内,如果你需要微秒级别的慢查询,可以考虑给mysql打补丁:http://www.percona.com/docs/wiki/release:start,记得找对应的版本。 
    打开慢查询日志可能会对系统性能有一点点影响,如果你的mysql是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。

    连接数

    查询数据库最大连接数 
    show variables like ‘max_connections’;

    查询数据库响应的最大连接数 
    show global status like ‘max_used_connections’;

    Max_used_connections / max_connections * 100% ≈ 85% 
    最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。

    innodb_buffer_pool_size(重要)

    Innodb_buffer_pool_size: 这个参数主要缓存innodb表的索引,数据,插入数据时的缓冲。这个值越大,则磁盘IO越少,查询的速度就会越快。这个值太大了就会影响操作系统的性能。一般将该值设为物理内存的80%。

    mysql> SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool%’;

    Variable_name Value
    Innodb_buffer_pool_read_requests 25623124
    Innodb_buffer_pool_reads 8204

    一共有25623124个索引读取请求,有8204个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率: 
    cache_miss_rate = 8204/25623124 = 0.032% 
    在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在 0.01%以下的话,Innodb_buffer_size分配的过多,可以适当减少。

    innodb_buffer_pool_size 大小建议

    mysql> SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool_pages_data’;

    Variable_name Value
    Innodb_buffer_pool_pages_data 1388

    1 row in set (0.00 sec) 
    mysql> SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool_pages_total’;

    Variable_name Value
    Innodb_buffer_pool_pages_total 131071

    1 row in set (0.00 sec)

    mysql> SHOW GLOBAL STATUS LIKE ‘Innodb_page_size’;

    Variable_name Value
    Innodb_page_size 16384

    1 row in set (0.00 sec) 
    ‘Innodb_buffer_pool_pages_data’/ ‘Innodb_buffer_pool_pages_total’ 
    当结果 > 95% 则增加 innodb_buffer_pool_size, 建议使用 ram total 75% 
    当结果 < 95% 则减少 innodb_buffer_pool_size, 
    建议 ‘Innodb_buffer_pool_pages_data’ X ‘Innodb_page_size’ X 1.05 / (1024*1024*1024)

    mysql(MyISAM)服务器还提供了key_blocks_*参数:

    mysql> show global status like ‘key_blocks_u%’;

    variable_name value
    key_blocks_unused 0
    key_blocks_used 413543

    key_blocks_unused表示未使用的缓存簇(blocks)数,key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置: 
    key_blocks_used / (key_blocks_unused + key_blocks_used) * 100% ≈ 80% 
    临时表 
    tmp_table_size=14M # 默认为16M,调到64-256最挂 内存中的每个临时表允许的最大大小。如果临时表大小超过该值,临时表将自动转为基于磁盘的表(Disk Based Table)。 如果需要的话并且你有很多group by语句,增大他的值

    mysal> show global status like ‘created_tmp%’;

    Variable_name Value
    Created_tmp_disk_tables 21197
    Created_tmp_files 58
    Created_tmp_tables 1771587

    每次创建临时表,created_tmp_tables增加,如果是在磁盘上创建临时表,created_tmp_disk_tables也增加,created_tmp_files表示mysql服务创建的临时文件文件数,比较理想的配置是: 
      created_tmp_disk_tables / created_tmp_tables * 100% <= 25% 
    比如上面的服务器created_tmp_disk_tables / created_tmp_tables * 100% = 12%

    再看一下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 29360128

    只有28MB以下的临时表才能全部放内存,超过的就会用到硬盘临时表。

    open table

    table_open_cache:表示同时打开的表的个数。这个值越大,能同时打开的表的个数就越多。这个值不是越大越好,因为同时打开的表过多会影响操作系统的性能。 
    mysql> show global status like ‘open%tables%’;

    variable_name value
    open_tables 100
    opened_tables 112

    open_tables表示打开表的数量,opened_tables表示打开过的表数量,如果opened_tables数量过大,说明配置中 table_open_cache值可能太小,我们查询一下服务器table_cache值:

    mysql> show variables like ‘table_open_cache’;

    variable_name value
    table_open_cache 2000

    比较合适的值为: 
    open_tables / opened_tables * 100% >= 85% 
    open_tables / table_open_cache* 100% <= 95% 
    线程使用情况 
    innodb_thread_concurrency=8 # InnoDB内核最大并发线程数, 该参数取值为服务器逻辑CPU数量*2 
    thread_cache_size=8 # 缓存的最大线程数。当客户端连接断开时,如果客户端总连接数小于该值,则处理客户端任务的线程放回缓存。在高并发情况下,如果该值设置得太小,就会有很多线程频繁创建,线程创建的开销会变大,查询效率也会下降。一般来说如果在应用端有良好的多线程处理,这个参数对性能不会有太大的提高。

    mysql> show global status like ‘thread%’;

    Variable_name Value
    Threads_cached 46
    Threads_connected 2
    Threads_created 570
    Threads_running 1

    如果我们在mysql服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(线程池)(前提是缓存数未达上限)。threads_created表示创建过的线程数,如果发现threads_created值过大的话,表明 mysql服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器 thread_cache_size配置: 
    mysql> show variables like ‘thread_cache_size’;

    Variable_name Value
    thread_cache_size 10

    查询缓存(query cache)

    每次插入,更新等操作会将之前的缓存清掉 垂直分割

    query_cache_size:查询缓存大小,用于缓存SELECT查询结果。如果有许多返回相同查询结果的SELECT查询,并且很少改变表,可以设置query_cache_size大于0,可以极大改善查询效率。而如果表数据频繁变化,就不要使用这个,会适得其反

    query_cache_type:表示查询缓存区的开启状态。0表示关闭,1表示开启。

    mysql> show global status like ‘qcache%’;

    variable_name value
    qcache_free_blocks 22756
    qcache_free_memory 76764704
    qcache_hits 213028692
    qcache_inserts 208894227
    qcache_lowmem_prunes 4010916
    qcache_not_cached 13385031
    qcache_queries_in_cache 43560
    qcache_total_blocks 111212

    mysql查询缓存变量解释:

    qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。flush query cache会对缓存中的碎片进行整理,从而得到一个空闲块。

    qcache_free_memory:缓存中的空闲内存。

    qcache_hits:每次查询在缓存中命中时就增大

    qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。

    qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况) 
    qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 select 语句或者用了now()之类的函数。 
    qcache_queries_in_cache:当前缓存的查询(和响应)的数量。 
    qcache_total_blocks:缓存中块的数量。 
    我们再查询一下服务器关于query_cache的配置:

    mysql> show variables like ‘query_cache%’;

    variable_name value
    query_cache_limit 2097152
    query_cache_min_res_unit 4096
    query_cache_size 203423744
    query_cache_type on
    query_cache_wlock_invalidate off

    各字段的解释: 
    query_cache_limit:超过此大小的查询将不缓存 
    query_cache_min_res_unit:缓存块的最小大小 
    query_cache_size:查询缓存大小 
    query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询 
    query_cache_wlock_invalidate:当有其他客户端正在对myisam表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。 
    query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4kb,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。 
    查询缓存碎片率 = qcache_free_blocks / qcache_total_blocks * 100% 
    如果查询缓存碎片率超过20%,可以用flush query cache整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。 
    查询缓存利用率 = (query_cache_size - qcache_free_memory) / query_cache_size * 100% 
    查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。 
    查询缓存命中率 = (qcache_hits - qcache_inserts) / qcache_hits * 100% 
    示例服务器 查询缓存碎片率 = 20.46%,查询缓存利用率 = 62.26%,查询缓存命中率 = 1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。 
    排序使用情况 
    Sort_buffer_size:排序缓存区的大小,这个值越大,排序就越快。(Group by 和 Order by) 
    查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M

    mysql> show global status like ‘sort%’;

    variable_name value
    sort_merge_passes 0
    sort_range 7
    sort_rows 5201
    sort_scan 25

    sort_merge_passes 包括两步。mysql 首先会尝试在内存中做排序,使用的内存大小由系统变量 sort_buffer_size 决定,如果它的大小不够把所有的记录都读到内存中,mysql 就会把每次在内存中排序的结果存到临时文件中,等 mysql 找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加 sort_merge_passes。 
    实际上,mysql 会用另一个临时文件来存再次排序的结果,所以通常会看到 sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增加 sort_buffer_size 会减少 sort_merge_passes 和 创建临时文件的次数。但盲目的增加 sort_buffer_size 并不一定能提高速度,见 how fast can you sort data with mysql?(引自http://qroom.blogspot.com/2007/09/mysql-select-sort.html,貌似被墙) 
    另外,增加record_rnd_buffer_size的值对排序的操作也有一点的好处,参见:http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/

    文件打开数(open_files)

    mysql> show global status like ‘open_files’;

    variable_name value
    open_files 16

    mysql> show variables like ‘open_files_limit’;

    variable_name value
    open_files_limit 4590

    比较合适的设置:open_files / open_files_limit * 100% <= 75% 
    表锁情况

    mysql> show global status like ‘table_locks%’;

    variable_name value
    table_locks_immediate 1708
    table_locks_waited 0

      table_locks_immediate表示立即释放表锁数,table_locks_waited表示需要等待的表锁数,如果 table_locks_immediate / table_locks_waited > 5000,最好采用innodb引擎,因为innodb是行锁而myisam是表锁,对于高并发写入的应用innodb效果会好些。示例中的服务器 table_locks_immediate / table_locks_waited = 235,myisam就足够了。

    表扫描情况

    mysql> show global status like ‘handler_read%’;

    Variable_name Value
    Handler_read_first 5
    Handler_read_key 1639
    Handler_read_last 0
    Handler_read_next 12
    Handler_read_prev 0
    Handler_read_rnd 202
    Handler_read_rnd_next 11605

    调出服务器完成的查询请求次数:

    mysql> show global status like ‘com_select’;

    variable_name value
    com_select 19

    计算表扫描率: 
    表扫描率 = handler_read_rnd_next / com_select 
    如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加join_buffer_size 值会有一些好处,但最好不要超过8mb。

    mysql> show variables like ‘join_buffer_size’;

    variable_name value
    join_buffer_size 262144

    对于join_buffer_size的优化,由于是每个线程单独分配,因此需要根据最大连接数,机器可用内存来分配,防止内存用尽或OOM 
    一般4-8M是一个比较合理的值,对于复杂的连接sql,可以在连接开始前手动指定join_buffer_size大小.

    innodb_flush_log_at_trx_commit =1 # 事务相关参数,如果值为1,则InnoDB在每次commit都会将事务日志写入磁盘(磁盘IO消耗较大),这样保证了完全的ACID特性。 设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。

    Max_connections:表示数据库的最大连接数。这个连接数不是越大越好,因为连接会浪费内存的资源。

    innodb_log_buffer_size=2M # InnoDB日志数据缓冲大小,如果缓冲满了,就会将缓冲中的日志数据写入磁盘(flush)。由于一般至少都1秒钟会写一次磁盘,所以没必要设置过大,即使是长事务。

    innodb_log_file_size=53M # 每一个InnoDB事务日志的大小。一般设为innodb_buffer_pool_size的25%到100%

    展开全文
  • MySQL参数配置

    千次阅读 2019-06-09 17:44:03
    通过根据服务器目前状况,修改Mysql的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能。 2、服务器参数: 32G内存、4个CPU,每个CPU 8核。 3、MySQL目前安装状况。 MySQL目前安装,用的是MySQL...
  • php 下进行mysql参数化查询

    千次阅读 2016-02-24 21:42:51
    记录一下,php下的mysql参数化查询 [php] view plain $query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",   mysql_real_escape_string($Username),
  • mysql参数sql_log_bin配置

    千次阅读 2018-11-21 18:47:40
    mysql参数sql_log_bin配置 如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现。 比如想在主库上修改某个表的定义,但是在slave库上不做修改: 1 2 3 ...
  • mysql参数优化建议

    千次阅读 2015-01-10 09:37:40
    要想提高mysql的性能,首先就是必须对mysql的配置参数进行了解,在了解了mysql的配置参数后,根据自己的项目需要以及运行环境,再做出相应的调整,那么以下这些参数是经过对mysql的官方配置参数说明、网上资料查询,...
  • Mysql参数详解

    千次阅读 2014-05-17 10:29:29
    MySQL有两种途径途径了解其的配置参数,一个是MySQL交互模式下的命令SHOW VARIABLES,一个使用mysqladmin variables 查询。 MySQL的配置参数分为2种,全局的和局部的。局部的配置变量可以在每次会话中自己更改。 ...
  • mysql参数max_binlog_cache_size

    万次阅读 2017-04-27 18:27:06
    mysql参数max_binlog_cache_size max_binlog_cache_size 表示的是binlog 能够使用的最大cache 内存大小 可以通过set global max_binlog_cache_size=1048576(字节) 或者直接改配置文件,默认是1M 通过show global ...
  • mysql 参数优化配置

    千次阅读 2018-04-19 10:56:51
    网站访问量大 怎样优化mysql数据库MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是 MySQL安装时的编译优化,三是自身配置文件my.cnf的优化;如果单机的优化也解决不了你的...
  • mysql参数永久设置

    千次阅读 2016-09-20 13:22:04
    设置数据库系统参数有两种方式:一种是动态设置,即使用数据库登录账户和密码登录数据库服务(如果数据库服务重启的话设置失效),在SQL命令提示符下执行设置参数SQL命令,如设置开启定时任务命令为“set global ...
  • 首先mysql参数:innodb_flush_log_at_trx_commit 0(延迟写、flush 同时进行) log buffer 将每秒一次地写入 log file 中,并且 log file 的 flush 操作同时进行。 该模式下,在事务提交的时候,不会主动触发写入...
  • java Mysql参数化查询

    2016-04-26 06:52:30
    如题,我想在servlet的doGet函数里写从MySQL数据库中读取数据,查询语句不能拼字符串,要用参数化的方式,求这一流程的代码,学习完了马上就能用到。
  • Mysql参数化查询,防止Mysql注入

    千次阅读 2018-06-13 22:08:41
    参数化查询 (Parameterized Query 或 Parameterized Statement) 是指在设计与数据库连接并访问数据时,在需要填写数值或数据的地方,使用参数(Parameter)来给值,这个方法目前已被视为最有效可预防SQL注入攻击(SQL ...
  • mysql之 CentOS系统针对mysql参数优化

    千次阅读 2018-09-29 11:48:26
    内核相关参数(/etc/sysctl.conf)   以下参数可以直接放到sysctl.conf文件的末尾:  net.core.somaxconn = 65535  net.core.netdev_max_backlog = 65535  net.ipv4.tcp_max_syn_backlog = 65535  加快TCP连接的...
  • MySql参数化模糊查询

    千次阅读 2019-02-14 08:50:36
    今天在做mysql模糊查询的时候碰到一些问题,利用参数化的时候会使语法不正确, 仅供个人参考 之前的错误代码 public Pageing&amp;lt;List&amp;lt;College&amp;gt;&amp;gt; GetCollegeList(string...
  • MySQL参数DELAY_KEY_WRITE的详细说明

    千次阅读 2016-02-22 11:36:19
    MySQL参数DELAY_KEY_WRITE的相关知识是本文我们主要要介绍的内容,DELAY_KEY_WRITE是指在表关闭之前,将对表的update操作指跟新数据到磁盘,而不更新索引到磁盘,把对索引的更改记录在内存。这样MyISAM表可以使索引...
  • [MySQL]调整MySQL参数提高写入速度

    万次阅读 2016-01-16 00:14:11
    我用的是zip版的mysql,所以在根目录下只有一个初始的my-default.ini,如果要修改配置参数,需要将待修改的参数复制进去,然后改名为my.ini,重启Mysql服务即可生效。言归正传,之前为了结局磁盘读写的瓶颈问题,使用...
  • docker环境下mysql参数修改

    千次阅读 2019-05-30 17:48:59
    需要修改log_bin为on,看了好几个博客说都需要删掉容器重新生成,然而并非如此, 我们可以用docker ...docker cp 3c8d188f7fb48:/etc/mysql/mysql.conf.d/mysqld.cnf /home/ 修改文件内容,添加参数行 log_bin=on ...
  • MySQL参数lower_case_table_names

    千次阅读 2021-05-01 13:25:12
    这是一个全局参数参数文件里面的命令行模式设置是--lower-case-table-names=1 默认是不打开的,值的类型是Integer,默认值为0,最小值1,最大值2. 0:表名字是存储给定的大小并且是区分大小写的。 1:表名字...
  • MySql 参数动态修改

    千次阅读 2016-11-25 13:59:32
    1 show variables like '%innodb_buffer_pool_size%'; 2 set global innodb_flush_log_at_trx_commit = 0; ...3 set global bulk_insert...我的机器的mysql路径C:\ProgramData\MySQL\MySQL Server 5.7
  • MySQL参数 之 innodb_buffer_pool_size

    千次阅读 2019-03-26 18:59:16
    《深入浅出MySQL》一文中这样描述Innodb_buffer_pool_size: 该参数定义了 InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小。和 MyISAM 存储引擎不同,MyISAM 的 key_buffer_size只缓存索引键, 而 innodb...
  • MySQL 参数优化:32G memory,32 core

    千次阅读 2018-05-17 13:32:02
    MySQL性能优化之参数配置1、目的:通过根据服务器目前状况,修改Mysql的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能。 2、服务器参数:32G内存、4个CPU,每个CPU 8核。3、MySQL目前安装状况。...
  • golang 连接mysql 参数备忘

    千次阅读 2017-09-14 11:20:19
    If you are not relying on read-only transactions to reject writes that aren't supposed to happen, setting this on some MySQL providers (such as AWS Aurora) is safer for failovers. strict Type...
  • mysql&gt; select tidb_version()\G *************************** 1. row *************************** tidb_version(): Release Version: v2.1.0-rc.1-1-g01c6bd8 Git Commit Hash: 01c6bd820c752d6ee739020...
  • MySQL参数优化:back_log

    千次阅读 2016-12-13 16:24:19
    * 修改back_log参数值:由默认的50修改为500.(每个连接256kb, 占用:125M)  back_log=500  查看mysql 当前系统默认back_log值,命令:  show variables like 'back_log';  back_log值指出在MySQL暂时...
  • 背景是要做一个查询用户和用户权限的用户中心,使用Mysql数据库。 查询其他表都OK,唯独权限表通过代码查询后结果为空。 先上表结构和代码: 表结构 CREATE TABLE `Permission` ( `PermissionID` varchar(3...
  • MySQL参数--init-file

    千次阅读 2016-03-21 15:30:41
    mysql init-file

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,967
精华内容 18,786
关键字:

mysql参数

mysql 订阅