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

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

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

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

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

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

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

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

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

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

A.1.4 Data Access Patterns

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

Keyblocksused:保存在 key 缓存里1024字节块的数目。
Keyreadrequests:请求读索引块的数目。这个索引也许被发现在缓存里,或者在磁盘上。
Keyreads:从磁盘物理读取索引块的数目。
Key
writerequests:请求写入索引块的数目。
Key
writes:向磁盘物理写入索引块的数目。

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

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

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

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

A.1.7 Query Cache
Qcachequeriesincache:位于查询缓存中查询结果的数目。
Qcache
inserts:将查询结果放入查询缓存中的次数。
Qcachehits:缓存中查询结果命中的次数。
Qcache
lowmemprunes:因为内存紧张,需要删除缓存中查询结果的次数。理想情况下这个数值最好为零。如果这个数值经常不大于零,就要考虑增加 querycachesize 了。
Qcache
notcached:查询结果不缓存的次数。这因为查询明确选择不需要缓存,或者缓存结果大于 querycachelimit 。
Qcache
freememory:缓存中闲置的空间(以字节为单位)。
Qcache
freeblocks:缓存中闲置 block 的数目。
Qcache
total_blocks:缓存中 block 的总数目。

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

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

Selectfullrange_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.

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

Slowqueries
Number of queries that have taken more than long
query_time.

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

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

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

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

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

2 Comments

  1. pickupli said,

    August 31, 2006 at 3:14 pm

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

  2. xfirefox said,

    November 26, 2006 at 12:52 pm

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

Post a Comment