mysql服务器配置优化

1.在linux系统中使用which mysqld确定msyql的配置文件所在

2.配置设置都是小写的,使用下划线或破折号分割单词

3.在32位的linux操作系统上,单个进程使用的内存是2.5G-2.7G,系统函数库不能一次分配2G大小的内存,所以mysql的任何配置都应该小于2G

4.最重要的缓存:操作系统为myisam的数据提供的缓存、myisam的缓存、InnoDB缓存池、查询缓存

5、MyISAM键缓存,只缓存了索引,没有数据
key_buffer_size,它的值应该占到保留内存的25%-50%,改变量的最大上限是4GB,即使没有使用myisam,也要为key_buffer_size设置一个值,如32M
myisam_block_size控制了键缓存块的大小,默认是4k

6、thread_cache_size 线程缓存,除非服务器有很多连接,否则就没有必要改变该值

7、给InnoDB的缓存池分配比较大的内存,在专用服务器上应该分配80%的物理内存,innodb_buffer_pool_size

8、在mysql5.1中,表缓存被分为了两部分,打开表和表的定义(table_open_cache和table_definition_cache),通常可以把table_definition_cache设置的足够高,以缓存所有表的定义。如果使用show status like '%open%'命令查看Opened_tables值很大或上升的很快,那就应该加大table_open_cache.如果mysql提示不能打开更多文件,那就应该提高open_files_limit 的值。

9、myisam:批处理通常性能会更好。delay_key_write变量来延迟索引的写入。myisam_recover_options决定了在打开MyISAM表的时候以何种方式恢复。myisam_use_mmap内存映射,开启将可以直接通过系统页面缓存访问.myd。

10.当一个查询中任何列超过了max_length_for_sort_data规定的大小,将使用双路排序。诸如text、blob列可以使用substring截取部分。

11、全局变量解释:
show global status;
+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| Aborted_clients                   | 0        |
如果这个变量随时间增加,就要确定连接是否关闭了
| Aborted_connects                  | 0        |
这个值应该接近于0
| Binlog_cache_disk_use             | 0        |
| Binlog_cache_use                  | 0        |
上面两个值之间的比率如果很大的话,就应该增加binlog_cache_size的值
| Bytes_received                    | 666      |
| Bytes_sent                        | 223011   |
这两个值如果很大的话,要确定是否提取了不需要的数据
| Com_*                             | 0        |
注意不要出现不常用的值
| Compression                       | OFF      |
| Connections                       | 4        |
该值如果过大,就要检查连接数
| Created_tmp_disk_tables           | 1        |
如果该值过大,有两种情形,blob或text列创建了临时表
tmp_table_size和max_heap_table_size可能不够大
| Created_tmp_files                 | 5        |
| Created_tmp_tables                | 7        |
该值如果较高,优化查询
| Delayed_errors                    | 0        |
| Delayed_insert_threads            | 0        |
| Delayed_writes                    | 0        |
| Flush_commands                    | 1        |
| Handler_commit                    | 0        |
| Handler_delete                    | 0        |
| Handler_discover                  | 0        |
| Handler_prepare                   | 0        |
| Handler_read_first                | 3        |
| Handler_read_key                  | 0        |
| Handler_read_next                 | 0        |
| Handler_read_prev                 | 0        |
| Handler_read_rnd                  | 0        |
| Handler_read_rnd_next             | 1369     |
Handler_read_rnd_next/Handler_read_rnd显示了全表扫描的大致
平均值,如果该值较高,那就应该优化架构和索引
| Key_blocks_not_flushed            | 0        |
| Key_blocks_unused                 | 75897    |
| Key_blocks_used                   | 0        |
Key_blocks_used*Key_cache_blocks_size远远小于key_buffer_size
则表示key_buffer_size过大,内存被浪费了
| Key_read_requests                 | 0        |
| Key_reads                         | 0        |
注意观察美妙发生的最大读取数
| Key_write_requests                | 0        |
| Key_writes                        | 0        |
| Last_query_cost                   | 0.000000 |
| Max_used_connections              | 3        |
如果该值和max_connections相同,那么是max_connections
设置的可能过小。但该值不要轻易增大。
| Not_flushed_delayed_rows          | 0        |
| Open_files                        | 20       |
注意他不要和open_file_limit接近,如果接近了
open_file_limit应该增大。
| Open_streams                      | 0        |
| Open_table_definitions            | 16       |
| Open_tables                       | 9        |
| Opened_tables                     | 16       |
应该将该值和table_cache进行对比,如果每秒有太多
opened_tables,那么说明table_cache还不够大。
| Opened_files                      | 68       |
| Opened_table_definitions          | 16       |
| Prepared_stmt_count               | 0        |
| Qcache_*                          | 0        |
| Queries                           | 14       |
| Questions                         | 14       |
| Rpl_status                        | NULL     |
| Select_full_join                  | 0        |
全联接是无索引联接,真正的性能杀手,最好能避免全连接。
| Select_full_range_join            | 0        |
如果该值过高,表明使用了范围查询联接表。可以优化。
| Select_range                      | 0        |
| Select_range_check                | 0        |
表示了在联接时,对每一行数据重新检索索引的查询计划数量。这个
性能开销很大。
| Select_scan                       | 8        |
| Slave_open_temp_tables            | 0        |
| Slave_retried_transactions        | 0        |
| Slave_running                     | OFF      |
| Slow_launch_threads               | 0        |
该变量较大说明了某些因素正在延迟联接的新线程。通常表示系统过载。
| Slow_queries                      | 0        |
| Sort_merge_passes                 | 0        |
该变量较大,应该增加sort_buffer_size.最好的办法是优化查询。
| Sort_range                        | 0        |
| Sort_rows                         | 0        |
| Sort_scan                         | 0        |
| Ssl_accept_renegotiates           | 0        |
| Ssl_accepts                       | 0        |
| Ssl_callback_cache_hits           | 0        |
| Ssl_cipher                        |          |
| Ssl_cipher_list                   |          |
| Ssl_client_connects               | 0        |
| Ssl_connect_renegotiates          | 0        |
| Ssl_ctx_verify_depth              | 0        |
| Ssl_ctx_verify_mode               | 0        |
| Ssl_default_timeout               | 0        |
| Ssl_finished_accepts              | 0        |
| Ssl_finished_connects             | 0        |
| Ssl_session_cache_hits            | 0        |
| Ssl_session_cache_misses          | 0        |
| Ssl_session_cache_mode            | NONE     |
| Ssl_session_cache_overflows       | 0        |
| Ssl_session_cache_size            | 0        |
| Ssl_session_cache_timeouts        | 0        |
| Ssl_sessions_reused               | 0        |
| Ssl_used_session_cache_entries    | 0        |
| Ssl_verify_depth                  | 0        |
| Ssl_verify_mode                   | 0        |
| Ssl_version                       |          |
| Table_locks_immediate             | 19       |
| Table_locks_waited                | 0        |
有多少表被锁住,并导致了服务器级的锁等待。如果该值较高
说明有严重的并发瓶颈。考虑使用InnoDB,手动对大表进行分区
,优化查询,启用并发插入或者对锁定设置进行优化。
| Tc_log_max_pages_used             | 0        |
| Tc_log_page_size                  | 0        |
| Tc_log_page_waits                 | 0        |
| Threads_cached                    | 0        |
| Threads_connected                 | 3        |
| Threads_created                   | 3        |
该变量较大或正在增加,就应该考虑增加thread_cache_size的
可以通过检查thread_cache知道多少线程在缓存中。
| Threads_running                   | 1        |
| Uptime                            | 1007     |
| Uptime_since_flush_status         | 1007     |
+-----------------------------------+----------+

aborted_clients 客户端非法中断连接次数
aborted_connects 连接mysql失败次数
com_xxx xxx命令执行次数,有很多条
connections 连接mysql的数量
Created_tmp_disk_tables 在磁盘上创建的临时表
Created_tmp_tables 在内存里创建的临时表

Created_tmp_files 临时文件数
Key_read_requests The number of requests to read a key block from the cache
Key_reads The number of physical reads of a key block from disk
Max_used_connections 同时使用的连接数
Open_tables 开放的表
Open_files 开放的文件
Opened_tables 打开的表
Questions 提交到server的查询数
Sort_merge_passes 如果这个值很大,应该增加my.cnf中的sort_buffer值
Uptime 服务器已经工作的秒数

提升性能的建议:
1.如果opened_tables太大,应该把my.cnf中的table_cache变大
2.如果Key_reads太大,则应该把my.cnf中key_buffer_size变大.可以用Key_reads/Key_read_requests计算出cache失败率
3.如果Handler_read_rnd太大,则你写的SQL语句里很多查询都是要扫描整个表,而没有发挥索引的键的作用
4.如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections计算cache命中率
5.如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于内存的临时表代替基于磁盘的

posted @ 2011-09-10 18:37  rorshach  阅读(163)  评论(0编辑  收藏  举报