时间:2021-07-01 10:21:17 帮助过:35人阅读
7.5.4 编译和连接如何影响MySQL的速度 以下的大部分测试都是在Linux上用MySQL的基准套件来做的,不过它们对其他操作系统以及不同的工作量也是有一定启示的。 用 -static 连接的话,MySQL执行速度的速度是最快的。 在Linux上,用 pgcc 和 -O3 编译的代码最快
以下的大部分测试都是在Linux上用MySQL的基准套件来做的,不过它们对其他操作系统以及不同的工作量也是有一定启示的。
用
-static
连接的话,MySQL执行速度的速度是最快的。
在Linux上,用 pgcc
和 -O3
编译的代码最快。大概需要200MB的内存加上这些选项来编译 `sql_yacc.cc`,因为 gcc/pgcc
需要大量内存来编译所有的内部函数。想要配置MySQL以避免包含 libstdc++
库就要加上 CXX=gcc
参数,不过这不是必须的。注意,使用某些版本的 pgcc
编译的结果代码只能在奔腾处理器上运行,尽管已经给编译器增加选项想让结果代码可以在所有的x586类型(如AMD)处理器上运行。
如果使用比较好的编译器以及编译选项,应用程序大概能提高10-30%的速度。这在自己编译MySQL服务器的时候尤为重要。
我们已经测试
Cygnus CodeFusion 和 Fujitsu
编译器了,不过测试它们时,无论哪个都没有完全地解决bug以允许最佳方式编译MySQL。
标准的MySQL二进制发布包已经编译支持所有的字符集了。如果想要自己编译MySQL,只需编译支持想要使用的字符集。可以在
configure
时增加 --with-charset
选项来控制。
以下是我们已经做过的一些测量:
pgcc
-O6
选项,则 mysqld
服务器会比用 gcc
2.95.2-static
),则在Linux上结果会慢13%。注意,这仍然可以让你的应用程序客户端动态连接MySQL的库。这对提高服务器性能相当关键。 strip mysqld
localhost
--with-debug=full
--with-debug
(没有=full
),则只会慢15%。一个使用 --with-debug=full
选项编译后的mysqld
可以在启动时增加 --skip-safemalloc
选项来禁用运行时内存检查。则执行速度就会接近于增加--with-debug
参数时的情况。 gcc
3.2 编译的快4%。 gcc
2.95.2 编译,增加
-mcpu=v8 -Wa,-xarch=v8plusa
选项的话会快4%。
gcc
编译,不增加-fomit-frame-pointer
或 -fomit-frame-pointer -ffixed-ebp
)选项MySQL AB提供的Linux上的MySQL二进制发布包通常用 pgcc
编译。不过我们又重新使用
gcc
来编译了,因为用 pgcc
编译的代码不能在AMD上运行。我们会一直使用 gcc
来编译直到
pgcc
的这个bug解决了。与此同时,如果你有非AMD机器,就可以用 pgcc
来编译以使MySQL更快。标准的MySQL
Linux二进制包是静态连接的,这使得它更快且移植性更好。
以下展示了 mysqld
服务器使用内存的几种方法。可适用的是,和使用内存相关的系统变量名已经给出了:
key_buffer_size
变量)在所有的线程间是共享的;服务器所需的其他缓冲已经分配好了。详情请看"thread_stack
变量)。
net_buffer_length
net_buffer_length
变量)。连接缓冲和结果缓冲可根据需要动态扩大到
max_allowed_packet
。一个查询正在执行时,当前查询语句的一份拷贝也需要为之分配内存。
ISAM
和 MyISAM
read_buffer_size
变量)。 read_rnd_buffer_size
HEAP
BLOB
字段的临时表都会存储在磁盘中。在MySQLtmp_table_size
后,就会产生一个 The
table
tbl_name is full
错误。在MySQL 3.23.2后,这会自动处理,在必须的时候把内存表转换成基于磁盘存储的MyISAM
表。想要在旧版本的MySQL也能正常运行,可以给 mysqld
设置 tmp_table_size
SQL_BIG_TABLES
选项。详情请看"SET
Syntax"。在MySQLrecord_buffer*16
;如果你使用这个版本,就必须加大record_buffer
--big-tables
选项启动 mysqld
malloc()
和 free()
来完成。MyISAM
和 ISAM
3 * N
的缓冲(N 是记录的最大长度,不计算 BLOB
字段)。BLOB
BLOB
数据长度多出来5到8字节。MyISAM
和 ISAM
BLOB
字段的表,专门为其扩展一个动态缓冲来读取大BLOB
数据。读表的时候,就会分配一个以最大长的 BLOB
FLUSH TABLES
语句或mysqladmin flush-tables
ps
和其他系统程序都可以报告 mysqld
使用了大量内存。这个可能是因为在不同内存地址上的线程堆栈导致。例如,Solaris下的
ps
会把堆栈中未使用的内存也认为是已使用了。可以通过 swap -s
命令来检查可用的交换内存。我们已经用好几个内存泄漏监测器来测试了
mysqld
(包括商业的和开源的),应该不会存在内存泄漏。
当一个新的客户端连接到 mysqld
时,它就会产生一个新的线程来处理。这个线程首先检查客户主机名是否在主机缓存中。如果没有,它就尝试解析这个主机名:
gethostbyaddr_r()
和 gethostbyname_r()
在
mysqld
启动时使用 --skip-name-resolve
选项就能禁用DNS解析。不过,这样的话就不能在MySQL的授权表中使用主机名了而只能用ip格式。
如果DNS解析很慢且有很多主机,那么可以用
--skip-name-resolve
选项禁用DNS解析或者重新编译 mysqld
时增加 HOST_CACHE_SIZE
的定义值(默认是 128)来提高性能。
启动服务器时使用 --skip-name-resolve
选项就能禁用主机缓存。想要清除主机缓存,可以提交 FLUSH HOSTS
语句或者运行 mysqladmin flush-hosts
命令。
想要彻底禁用TCP/IP连接,在启动服务器时使用 --skip-networking
选项即可。
‹ MySQL 优化(九)向上MySQL 优化(十一) ›