高邮网站开发,常州知名网站建设公司,企业资质查询,网站别人帮做的要注意什么文章目录 关于 MySQL 优化一、硬件方面的优化1、关于 CPU2、关于内存3、关于磁盘 二、MySQL 配置文件1、 default-time-zone8:002、interactive_timeout 1203、wait_timeout 1204、open_files_limit 102405、group_concat_max_len 1024006、usermysql7、character-set-serv… 文章目录 关于 MySQL 优化一、硬件方面的优化1、关于 CPU2、关于内存3、关于磁盘 二、MySQL 配置文件1、 default-time-zone8:002、interactive_timeout 1203、wait_timeout 1204、open_files_limit 102405、group_concat_max_len 1024006、usermysql7、character-set-serverutf8、init_connectSET NAMES utf88、back_log 6009、max_connections 500010、max_connect_errors 600011、table_cache 102412、table_open_cache 204813、max_heap_table_size 256M14、external-locking false15、max_allowed_packet 32M16、sort_buffer_size 512M17、join_buffer_size 8M18、thread_cache_size 30019、thread_concurrency 820、query_cache_size 512M21、query_cache_limit 4M22、query_cache_min_res_unit 2k23、default-storage-engine innodb24、thread_stack 192K25、transaction_isolation READ-COMMITTED26、tmp_table_size 256M27、key_buffer_size 1024M28、read_buffer_size 2M29、read_rnd_buffer_size 256M30、bulk_insert_buffer_size 64M31、skip-name-resolve32、ft_min_word_len 1 三、关于MySQL二进制日志文件的优化1、log-binmysql-bin2、binlog_cache_size 4M3、max_binlog_cache_size 128M4、max_binlog_size 1G5、sync_binlog16、binlog_formatmixed7、expire_logs_days 78、log-slave-updates9、slow_query_log10、slow_query_log_fileslow.log11、long_query_time 2 四、关于引擎是innodb的优化1、innodb_additional_mem_pool_size 64M2、innodb_buffer_pool_size 20480M3、innodb_data_file_path ibdata1:1024M:autoextend4、innodb_file_io_threads 45、innodb_thread_concurrency 86、innodb_write_io_threads 87、innodb_read_io_threads 88、innodb_flush_log_at_trx_commit 29、innodb_log_buffer_size 16M10、innodb_log_file_size 256M11、innodb_log_files_in_group 312、innodb_file_per_table 113、innodb_max_dirty_pages_pct 9014、innodb_lock_wait_timeout 12015、innodb_open_files 8192 innodb 五、关于引擎是myisam的优化1、myisam_sort_buffer_size 128M2、myisam_max_sort_file_size 10G3、myisam_repair_threads 14、myisam_recover 六、SQL优化七、架构优化 关于 MySQL 优化
一、硬件方面的优化
说到服务器硬件最主要的无非 CPU、内存、磁盘三大关键因素。
1、关于 CPU
CPU 对于 MySQL 应用推荐使用 S.M.P.架构的多路对称 CPU。例如可以使用两颗Intel Xeon 3.6GHz 的 CPU。现在比较推荐用 4U 的服务器来专门做数据库服务器不仅仅是针对于 MySQL。
2、关于内存
物理内存对于一台使用 MySQL 的 Database Server 来说服务器内存建议不要小于2GB推荐使用 4GB 以上的物理内存。不过内存对于现在的服务器而言可以说是一个可以忽略的问题工作中遇到了高端服务器基本上内存都超过了 32G。
3、关于磁盘
磁盘寻道能力磁盘 I/O。以目前市场上普遍高转速 SAS 硬盘(15000 转/秒)为例 这种硬盘理论上每秒寻道 15000 次这是物理特性决定的没有办法改变。 MySQL 每秒钟都在进行大量、复杂的查询操作对磁盘的读写量可想而知。所以通常认为磁盘 I/O 是制约 MySQL 性能的最大因素之一通常是使用 RAID-01 磁盘阵列注意不要尝试使用RAID-5MySQL 在 RAID-5 磁盘阵列上的效率并不高。如果不考虑硬件的投入成本也可以考虑固态SSD硬盘专门作为数据库服务器使用。数据库的读写性能肯定会提高很多。
二、MySQL 配置文件
通常默认的 my.cnf 配置文件无法发挥出 MySQL 最高的性能所以需要根据不同的硬件进行优化配置文件的优化也是重点。下面是物理内存为 32G 的数据库优化参数具体从全局、二进制日志、主从、innodb、myisam 几个方面优化仅供参考。
1、 default-time-zone8:00
默认 MySQL 使用的是系统时区修改为北京时间也就是所说的东八区。
2、interactive_timeout 120
服务器关闭交互式连接前等待活动的秒数。
3、wait_timeout 120
服务器关闭非交互连接之前等待活动的秒数。
4、open_files_limit 10240
MySQL 服务器打开文件句柄数限制。
5、group_concat_max_len 102400
MySQL 默认的拼接最大长度为 1024 个字节由于 1024 个字节会出现不够用的情况 根据实际情况进行修改。
6、usermysql
使用 mysql 用户运行。
7、character-set-serverutf8、init_connect‘SET NAMES utf8’
设置字符集为 utf8
8、back_log 600
在 MySQL 暂时停止响应新请求之前短时间内的多少个请求可以被存在堆栈中。如果系统在短时间内有很多连接则需要增大该参数的值该参数值指定到来的 TCP/IP 连接的监听队列的大小。默认值 50。
9、max_connections 5000
MySQL 允许最大的进程连接数如果经常出现 Too Many Connections 的错误提示 则需要增大此值。
10、max_connect_errors 6000 设置每个主机的连接请求异常中断的最大次数。当超过该次数MySQL 服务器将禁止 host 的连接请求直到 MySQL 服务器重启或通过flush hosts 命令清空此host 的相关信息。
11、table_cache 1024 数据表调整缓冲区大小。它设置表高速缓存的数目。每个连接进来都会至少打开一个表缓存。因此table_cache 的大小与 max_connections 的设置有关。例如对于 200 个并行运行的连接应该让表的缓存至少有 200×N。这里 N 是应用可以执行查询的一个连接中表的最大数量。 此外还需要为临时表和文件保留一些额外的文件描述符。 当 MySQL 访问一个表时 如果该表在缓存中已经被打开则可以直接访问缓存。如果还没有被缓存但是在 MySQL 表缓冲区中还有空间那么这个表就被打开并放入表缓冲区。如果表缓存满了则会按照一定的规则将当前未用的表释放或者临时扩大表缓存来存放使用表缓存的好处是可以更快速地访问表中的内容。执行 flushtables 会清空缓存的内容。 一般来说可以通过 showstatus 命令查看数据库运行峰值时间的状态值 Open_tables 和 Opened_tables判断是否需要增加 table_cache 的值其中 open_tables 是当前打开的表的数量Opened_tables 则是已经打开的表的数量。若 open_tables 接近 table_cache 并且 Opened_tables 值在逐步增加 那就要考虑增加这个值的大小了。还有就是Table_locks_waited 比较高的时候也需要增加 table_cache。
12、table_open_cache 2048
指定表高速缓存的大小。每当MySQL 访问一个表时如果在表缓冲区中还有空间该表就被打开并放入其中这样可以更快地访问表内容。
13、max_heap_table_size 256M
这个变量定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变即 set max_heap_table_size#。但是对于已经存在的内存表就没有什么用了除非这个表被重新创建(create table)、修改(alter table)或者truncate table。服务重启也会设置已经存在的内存表为全局 max_heap_table_size 的值。
14、external-locking false
使用 skip-external-lockingMySQL 选项以避免外部锁定。该选项默认开启。
15、max_allowed_packet 32M
设置在网络传输中一次消息传输量的最大值。系统默认值为 1MB最大值是 1GB必须设置 1024 的倍数。
16、sort_buffer_size 512M
Sort_Buffer_Size 是一个 connection 级参数在每个 connectionsession第一次需要使用这个 buffer 的时候一次性分配设置的内存。Sort_Buffer_Size 并不是越大越好由于是 connection 级的参数过大的设置高并发可能会耗尽系统内存资源。
17、join_buffer_size 8M
用于表间关联缓存的大小和 sort_buffer_size 一样该参数对应的分配内存也是每个连接独享。
18、thread_cache_size 300
服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中如果线程重新被请求那么请求将从缓存中读取如果缓存中是空的或者是新的请求那么这个线程将被重新创建如果有很多新的线程增加这个值可以改善系统性能。通过比较 Connections 和 Threads_created 状态的变量可以看到这个变量的作用。设置规则如下1GB 内存配置为 82GB 配置为 16 3GB 配置为 324GB 或更高内存可配置更大。
19、thread_concurrency 8 设置 thread_concurrency 值的正确与否,对 MySQL 的性能影响很大,在多个 CPU(或多核)的情况下 错误设置了 thread_concurrency 的值 会导致 MySQL 不能充分利用多CPU(或多核)出现同一时刻只能一个 CPU 在工作的情况。thread_concurrency 应设为CPU 核数的 2 倍。比如有一个双核的 CPU那么 thread_concurrency 的应该为 42 个双核的cputhread_concurrency 的值应为 8。
20、query_cache_size 512M
使用 MySQL 的用户对于这个变量一定不会陌生。前几年的 MyISAM 引擎优化中 这个参数也是一个重要的优化参数。但随着发展这个参数也爆露出来一些问题。机器的内存越来越大人们也都习惯性的把以前有用的参数分配的值越来越大。这个参数加大后也引发了一系列问题。首先分析一下 query_cache_size 的工作原理一个 SELECT 查询在 DB 中工作后DB 会把该语句缓存下来。当同样的一个 SQL 再次来到 DB 里调用时DB 在该表没发生变化的情况下把结果从缓存中返回给 Client。这里有一个关建点就是 DB 在利用Query_cache 工作时要求该语句涉及的表在这段时间内没有发生变更。那如果该表在发生变更时Query_cache 里的数据又怎么处理呢首先要把 Query_cache 和该表相关的语句全部设置为失效然后再写入更新。那么如果 Query_cache 非常大该表的查询结构又比较多查询语句失效也慢一个更新或是 Insert 就会很慢这样看到的就是 Update 或是Insert 怎么这么慢了。所以在数据库写入量或是更新量也比较大的系统该参数不适合分配过大。而且在高并发写入量大的系统建议把该功能禁掉。
21、query_cache_limit 4M
指定单个查询能够使用的缓冲区大小缺省为 1M。
22、query_cache_min_res_unit 2k
默认是 4KB设置值大对大数据查询有好处但如果查询都是小数据查询就容易造成内存碎片和浪费查询缓存碎片率Qcache_free_blocks/Qcache_total_blocks100%。 如果查询缓存碎片率超过 20%可以用 FLUSHQUERYCACHE 整理缓存碎片或者尝试减小 query_cache_min_res_unit 。 如果查询都是小数据量 那么查询缓存利用率(query_cache_size–Qcache_free_memory)/query_cache_size100%。查询缓存利用率在 25%以下说明 query_cache_size 设置的过大可适当减小。查询缓存利用率在 80%以上而且 Qcache_lowmem_prunes50 的话说明 query_cache_size 可能有点小要不就是碎片太多。查询缓存命中率(Qcache_hits–Qcache_inserts)/Qcache_hits*100%。
23、default-storage-engine innodb
默认引擎现在一般都是 innodb 引擎表居多。
24、thread_stack 192K
设置 MySQL 每个线程的堆栈大小默认值足够大可满足普通操作。可设置范围为128K 至 4GB默认为 192KB。
25、transaction_isolation READ-COMMITTED
设定默认的事务隔离级别READCOMMITTEE 是已读提交。
26、tmp_table_size 256M
tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小MySQL 产生一个Thetabletbl_nameisfull 形式的错误如果执行很多高级GROUPBY 查 询 增 加tmp_table_size 值。如果超过该值则会将临时表写入磁盘。
27、key_buffer_size 1024M
指定用于索引的缓冲区大小增加它可以得到更好的索引处理性能。
28、read_buffer_size 2M
MySQL 读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区MySQL 会为它分配一段内存缓冲区。read_buffer_size 变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁并且认为频繁扫描进行得太慢可以通过增加该变量值以及内存缓冲区大小提高其性能。和 sort_buffer_size 一样该参数对应的分配内存也是每个连接独享。
29、read_rnd_buffer_size 256M
MySQL 的随机读查询操作缓冲区大小。当按任意顺序读取行时(例如按照排序顺序)将分配一个随机读缓存区。进行排序查询时MySQL 会首先扫描一遍该缓冲以避免磁盘搜索提高查询速度。如果需要排序大量数据可适当调高该值。但 MySQL 会为每个客户连接发放该缓冲空间所以应尽量适当设置该值以避免内存开销过大。
30、bulk_insert_buffer_size 64M
批量插入数据缓存大小可以有效提高插入效率默认为 8M。
31、skip-name-resolve
禁止域名解析包括主机名.所以授权的候要使用 IP 地址。
32、ft_min_word_len 1
从 MySQL4.0 开始就支持全文索引功能但是 MySQL 默认的最小索引长度是 4。如果是英文默认值是比较合理的但是中文绝大部分词都是 2 个字符这就导致小于 4 个字的词都不能被索引。MySQL 全文索引是专门为了解决模糊查询提供的可以对整篇文章预先按照词进行索引搜索效率高能够支持百万级的数据检索。
三、关于MySQL二进制日志文件的优化
1、log-binmysql-bin
打开 MySQL 二进制功能。
2、binlog_cache_size 4M
在事务过程中容纳二进制日志 SQL 语句的缓存大小。二进制日志缓存是服务器支持事务存储引擎并且服务器启用了二进制日志(—log-bin 选项)的前提下为每个客户端分配的内存。注意是每个 Client 都可以分配设置大小的 binlogcache 空间。可以通过 MySQL 的以下两个状态变量来判断当前的 binlog_cache_size 的状况 Binlog_cache_use 和Binlog_cache_disk_use。
3、max_binlog_cache_size 128M
表示 binlog 能够使用的最大 cache 内存大小。 执行多语句事务的时候 max_binlog_cache_size 如果不够大的话 系统可能会报出“Multi-statementtransactionrequiredmorethan’max_binlog_cache_size’bytesofstorage” 的错误。
4、max_binlog_size 1G
Binlog 日志最大值一般来说设置为 512M 或者 1G但不能超过 1G。该大小并不能非常严格控制 Binlog 大小尤其是当到达 Binlog 比较靠近尾部而又遇到一个较大事务的时候系统为了保证事务的完整性不可能做切换日志的动作只能将该事务的所有 SQL 都记录进入当前日志直到该事务结束。这一点和Oracle 的Redo 日志有点不一样因为Oracle 的 Redo 日志所记录的是数据文件的物理位置的变化而且里面同时记录了 Redo 和 Undo 相关的信息所以同一个事务是否在一个日志中对 Oracle 来说并不关键。而 MySQL 在Binlog 中所记录的是数据库逻辑变化信息MySQL 称之为 Event实际上就是带来数据库变化的 DML 之类的 Query 语句。
5、sync_binlog1
在 MySQL 中系统默认的设置是 sync_binlog0也就是不做任何强制性的磁盘刷新指令这时候的性能是最好的但是风险也是最大的。因为一旦系统 Crash在 binlog_cache 中的所有 binlog 信息都会被丢失。而当设置为“1”的时候最安全但也是性能损耗最大的设置。因为当设置为 1 的时候即使系统 Crash也最多丢失 binlog_cache 中未完成的一个事务对实际数据没有任何实质性影响。从以往经验和相关测试来看对于高并发事务的系统来说“sync_binlog”设置为 0 和设置为 1 的系统写入性能差距可能高达 5 倍甚至更多。
6、binlog_formatmixed
默认使用 statement 模式基于 SQL 语句的复制另外一种是基于行的复制为提升效率可以将以上两种模式混合使用。一般的复制使用 STATEMENT 模式保存 binlog对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlogMySQL 会根据执行的SQL 语句选择日志保存方式。
7、expire_logs_days 7
二进制日志只留存最近 7 天不用人工手动删除。
8、log-slave-updates
这条参数只读主从架构适用当从库 log_slave_updates 参数没有开启时从库的 binlog 不会记录来源于主库的操作记录。只有开启 log_slave_updates从库 binlog 才会记录主库同步的操作日志。
9、slow_query_log
打开慢查询日志。
10、slow_query_log_fileslow.log
慢查询日志文件位置。
11、long_query_time 2
记录超过 2 秒的 SQL 查询。
四、关于引擎是innodb的优化
1、innodb_additional_mem_pool_size 64M
这个参数用来设置 InnoDB 存储的数据目录信息和其它内部数据结构的内存池大小类似于 Oracle 的 library cache。这不是一个强制参数可以被突破。
2、innodb_buffer_pool_size 20480M
用于缓存索引和数据的内存大小这个选项的值越多越好 数据读写在内存中非常快 减少了对磁盘的读写。当数据提交或满足检查点条件后才一次性将内存数据刷新到磁盘中。 然而内存还有操作系统或数据库其他进程使用推荐设置 innodb-buffer-pool-size 为服务器总可用内存的 75%。 若设置不当 内存使用可能浪费或者使用过多。 对于繁忙的服务器 buffer pool 将划分为多个实例以提高系统并发性 减少线程间读写缓存的争用。buffer pool 的大小首先受 innodb_buffer_pool_instances 影响当然影响较小。
3、innodb_data_file_path ibdata1:1024M:autoextend
用 来 指 定 innodb tablespace 文 件 如 果 我 们 不 在 my.cnf 文 件 中 指 定innodb_data_home_dir 和innodb_data_file_path 那么默认会在datadir 目录下创建ibdata1 作为 innodb tablespace。
4、innodb_file_io_threads 4
文件 IO 的线程数一般为 4但是在 Windows 下可以设置得较大。
5、innodb_thread_concurrency 8
服务器有几个 CPU 就设置为几建议用默认设置一般为 8。
6、innodb_write_io_threads 8
InnoDB 使用后台线程处理数据页上写 I/O输入输出请求的数量。一般设置为 CPU核数比如 CPU 是 2 颗 8 核的可以设置为 8。
7、innodb_read_io_threads 8
InnoDB 使用后台线程处理数据页上读 I/O输入输出请求的数量。一般设置为 CPU核数比如 CPU 是 2 颗 8 核的可以设置为 8。
8、innodb_flush_log_at_trx_commit 2
如果将此参数设置为 1将在每次提交事务后将日志写入磁盘。为提高性能可以设置为 0 或 2但要承担在发生故障时丢失数据的风险。设置为 0 表示事务日志写入日志文件而日志文件每秒刷新到磁盘一次。设置为 2 表示事务日志将在提交时写入日志但日志文件每次刷新到磁盘一次。
9、innodb_log_buffer_size 16M
此参数确定日志文件所用的内存大小以 M 为单位。缓冲区更大能提高性能但意外的故障将会丢失数据。MySQL 开发人员建议设置为 18M 之间。
10、innodb_log_file_size 256M
此参数确定数据日志文件的大小以 M 为单位较大的值可以提高性能但也会增加恢复故障数据库所需的时间。
11、innodb_log_files_in_group 3
为提高性能MySQL 可以以循环方式将日志文件写到多个文件。
12、innodb_file_per_table 1
独享表空间关闭。
13、innodb_max_dirty_pages_pct 90
Buffer_Pool 中 Dirty_Page 所占的数量 直接影响 InnoDB 的关闭时间。 参数innodb_max_dirty_pages_pct 可以直接控制了 Dirty_Page 在 Buffer_Pool 中所占的比率 而且幸运的是innodb_max_dirty_pages_pct 是可以动态改变的。所以在关闭 InnoDB 之前先将 innodb_max_dirty_pages_pct 调小强制数据块 Flush 一段时间就能够大大缩短MySQL 关闭的时间。
14、innodb_lock_wait_timeout 120
InnoDB 有其内置的死锁检测机制能导致未完成的事务回滚。但是如果结合 InnoDB 使用 MyISAM 的 locktables 语句或第三方事务擎,InnoDB 就无法识别死锁。为消除这种可能性可以将 innodb_lock_wait_timeout 设置为一个整数值设置 MySQL 在允许其他事务修改那些最终受事务回滚的数据之前要等待多长时间(秒数)。
15、innodb_open_files 8192 innodb
打开文件句柄数。
五、关于引擎是myisam的优化
1、myisam_sort_buffer_size 128M
MyISAM 表发生变化时重新排序所需的缓冲大小。
2、myisam_max_sort_file_size 10G
MySQL 重建索引时所允许的最大临时文件的大小(当 REPAIRALTERTABLE 或者LOADDATAINFILE)。如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)。
3、myisam_repair_threads 1
如果一个表拥有超过一个索引MyISAM 可以通过并行排序使用超过一个线程去修复。这对于拥有多个 CPU 以及大量内存情况的用户是一个很好的选择。
4、myisam_recover
自动检查和修复没有适当关闭的 MyISAM 表。
六、SQL优化
尽量使用索引进行查询优化分页GROUP BY优化
七、架构优化
架构选择: 主从、主主、一主多从、多主多从