[读书笔记]High Performance MySQL–附录A

A.1 SHOW STATUS
Show status 命令输出的是许多内部状态参数的快照。通过观察某些重要的参数,有助于解决 MySQL 的性能问题。这个附录列出了一些有关性能的重要参数。

A.1.1 Thread and Connection Statistics
Aborted_clients:由于客户断开连接时没有正确关闭进程,而导致放弃连接的数量。
Aborted_connects:尝试连接 MySQL 失败的数目。
Bytes_received:从所有客户端接受到的字节数量,包括那些参与 replication 的 Mysql 服务器。
Bytes_sent:发到所有客户端的字节数量,包括其他的 MySQL 服务器。
Connections:试图连接MySQL服务器的次数,包括成功的和失败的。
Max_used_connections:并发连接的峰值。
Slow_launch_threads:所用时间超过 slow_launch_time 的线程数目。这里如果是一个非零值通常表示 CPU 的负载比较大。
Threads_cached:处在线程缓存中的线程数目。
Threads_connected:当前打开连接的数目。
Threads_created:所产生线程的总数目。
Threads_running:正在运行的线程数目。
Uptime:服务器的运行时间(以秒计)。

A.1.2 Command Counters
MySQL 大部分参数都用来计算各种命令和查询运行的次数。

Com_*:各种命令和查询执行的次数。
Questions:发向服务器的命令和查询的总次数。

A.1.3 Temporary Files and Tables
正常情况下,MySQL 需要一次又一次地产生临时表和临时文件。如果这种情况过于频繁,会导致性能降低,因为这需要更多的磁盘 I/O 。

Created_tmp_disk_tables:存储在磁盘上临时表的数目。变量 tmp_table_size 决定了临时表该存储在磁盘上或者内存里。如果临时表大于 tmp_table_size ,那么它就会存储在磁盘上;反之,则会存储在内存里。CREATE TEMPORARY TABLE 命令不受此限制,命令产生的临时表只存储在磁盘上。

Created_tmp_tables:存储在磁盘上和内存里临时表的总数目。

Created_tmp_files:MySQL 产生临时文件的数目。

明显地是,你不可能消除那些使用磁盘的临时表,但是他们数目过多的话,你就要考虑增大 tmp_table_size 的值。

A.1.4 Data Access Patterns

A.1.5 MyISAM Key Buffer
MyISAM key buffer 是 MySQL 用来缓存经常用到的索引数据。通常来讲,一个较大的 key buffer 就意味着较少使用磁盘,那么查询也就更快。所以增大 key buffer 是一个非常有效提高性能的方法。

Key_blocks_used:保存在 key 缓存里1024字节块的数目。
Key_read_requests:请求读索引块的数目。这个索引也许被发现在缓存里,或者在磁盘上。
Key_reads:从磁盘物理读取索引块的数目。
Key_write_requests:请求写入索引块的数目。
Key_writes:向磁盘物理写入索引块的数目。

这里最后四个参数表示 MySQL 需要读写索引块的频率。当一个请求发生时,也许有或者也许没有一个读写来匹配。如果没有,那很好,因为表示数据已经在内存里,不需要去读写磁盘。

一个通用的规则,需求的次数最好是实际读写的50-100倍,当然越高越好。

A.1.6 File Descriptors
如果 MySQL 服务器要处理几百或几千的并发连接,你要留心所打开文件的 descriptors 的数目。如果你主要使用的是 MyISAM 表的话,那么 table_cache 设置对 MySQL 文件 descriptors 的使用具有很重要的影响。表缓存可以减少文件 .frm 重新打开的次数。

Open_tables:目前所打开表的数目。
Open_files:打开文件的总数目。
Open_streams:打开 streams 的数目。(这些绝大部分用于日志)
Opened_tables:自从服务器启动时打开过表的数目。如果 Opened_tables 远远大于 Open_tables,你就要考虑增加 table_cache 了。

A.1.7 Query Cache
Qcache_queries_in_cache:位于查询缓存中查询结果的数目。
Qcache_inserts:将查询结果放入查询缓存中的次数。
Qcache_hits:缓存中查询结果命中的次数。
Qcache_lowmem_prunes:因为内存紧张,需要删除缓存中查询结果的次数。理想情况下这个数值最好为零。如果这个数值经常不大于零,就要考虑增加 query_cache_size 了。
Qcache_not_cached:查询结果不缓存的次数。这因为查询明确选择不需要缓存,或者缓存结果大于 query_cache_limit 。
Qcache_free_memory:缓存中闲置的空间(以字节为单位)。
Qcache_free_blocks:缓存中闲置 block 的数目。
Qcache_total_blocks:缓存中 block 的总数目。

A.1.8 SELECTs
此节中的数值记录了一些有问题的 SELECT 查询。这些查询是那种如果找到合适的索引就会更有效率。如果这些数值不为零,或者保持一定的幅度增长,那么你就需要给查询找到合适的索引。

Select_full_join
Number of joins without keys. If this figure isn’t 0, you should check your indexes carefully.

Select_full_range_join
Number of joins that used a range search on reference table.

Select_range
Number of joins that used ranges on the first table. It’s normally not critical even if this number is big.

Select_scan
Number of joins that did a full scan of the first table.

Select_range_check
Number of joins that check for key usage after each row. If this isn’t 0, you should check your indexes.

Slow_queries
Number of queries that have taken more than long_query_time.

A.1.9 Sorts
如果经常排序很多行的话,这也将是个沉重的负担。

Sort_merge_passes:如果这个数值过高,就要考虑增加 sort_buffer 。
Sort_scan:使用全表 scan 的排序的数目。理想情况下,这不应该发生。如果发生的话,你需要在某处添加一个索引。

A.1.10 Table Locking
无论何时,如果 MySQL 在等一个表锁定解锁,这都不是什么好事。

Table_locks_immediate:服务器需要一个立即表锁定的次数。
Table_locks_waited:服务器不得不等待表锁定解锁的次数。

如果 Table_locks_waited 数值很大的话,那就意味着你需要让查询更有效率,或者需要更改表的类型。

2 条评论

  1. pickupli said,

    八月 31, 2006 at 3:14 下午

    读啊读啊,终于读到附录了,好书没买,看你的读后感也不错哦,先谢过了,然后继续读最后的这一篇.....

  2. xfirefox said,

    十一月 26, 2006 at 12:52 下午

    非常感谢,查MySQL Query Cache找到这的(第5章)。一直从头看到尾:)

Post a Comment