--------------------------------------------------------------------------------
九、优化MySQL
挑选编译器和编译选项。
位你的系统寻找最好的启动选项。
通读MySQL参考 手册并阅读Paul DuBios的《MySQL》一书。(已有中文版-译注)
多用EXPLAIN SELECT、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST。
了解查询优化器的工作原理。
优化表的格式。
维 护你的表(myisamchk、CHECK TABLE、 OPTIMIZE TABLE)
使用MySQL的扩展功能以让一切快速完成。
如 果你注意到了你将在很多场合需要某些函数,编写MySQL UDF函数。
不要使用表级或列级的GRANT,除非你确实需要。
购买 MySQL技术支持以帮助你解决问题:)
--------------------------------------------------------------------------------
十、编译和安装MySQL
通过位你的系统挑选可能最好的编译器,你通常可以获得10-30%的性能提高。
在 Linux/Intel平台上,用pgcc(gcc的奔腾芯片优化版)编译MySQL。然而,二进制代码将只能运行在Intel奔腾CPU上。
对 于一种特定的平台,使用MySQL参考手册上推荐的优化选项。
一般地,对特定CPU的原生编译器(如Sparc的Sun Workshop)应该比gcc提供更好的性能,但不总是这样。
用你将使用的字符集编译MySQL。
静态编译生成mysqld的执行 文件(用--with-mysqld-ldflags=all-static)并用strip sql/mysqld整理最终的执行文件。
注 意,既然MySQL不使用C++扩展,不带扩展支持编译MySQL将赢得巨大的性能提高。
如果操作系统支持原生线程,使用原生线程(而不用 mit-pthreads)。
用MySQL基准测试来测试最终的二进制代码。
--------------------------------------------------------------------------------
十一、维护
如果可能,偶尔运行一下OPTIMIZE table,这对大量更新的变长行非常重要。
偶尔用 myisamchk -a更新一下表中的键码分布统计。记住在做之前关掉MySQL。
如果有碎片文件,可能值得将所有文件复制到另一个磁盘上, 清除原来的磁盘并拷回文件。
如果遇到问题,用myisamchk或CHECK table检查表。
用mysqladmin -i10 precesslist extended-status监控MySQL的状态。
用MySQL GUI客户程序,你可以在不同的窗口内监控进程列表和状态。
使用mysqladmin debug获得有关锁定和性能的信息。
--------------------------------------------------------------------------------
十二、优化SQL
扬SQL之长,其它事情交由应用去做。使用SQL服务器来做:
找出基于 WHERE子句的行。
JOIN表
GROUP BY
ORDER BY
DISTINCT
不要使用SQL来 做:
检验数据(如日期)
成为一只计算器
技巧:
明智地使用键码。
键码适合搜索,但不适 合索引列的插入/更新。
保持数据为数据库第三范式,但不要担心冗余信息或这如果你需要更快的速度,创建总结表。
在大表上不做 GROUP BY,相反创建大表的总结表并查询它。
UPDATE table set count=count+1 where key_column=constant非常快。
对于大表,或许最好偶尔生成总结表而不是一直保持总结表。
充分利用INSERT的默 认值。
--------------------------------------------------------------------------------
十三、不同SQL服务器的速度差别(以秒计)
通过键码读取2000000行: NT Linux
mysql 367 249
mysql_odbc 464
db2_odbc 1206
informix_odbc 121126
ms-sql_odbc 1634
oracle_odbc 20800
solid_odbc 877
sybase_odbc 17614
插入350768行: NT Linux
mysql 381 206
mysql_odbc 619
db2_odbc 3460
informix_odbc 2692
ms-sql_odbc 4012
oracle_odbc 11291
solid_odbc 1801
sybase_odbc 4802
在上述测试中,MySQL配置8M高速缓存运行,其他数据库以默认安装运行。
--------------------------------------------------------------------------------
十四、重要的MySQL启动选项
back_log 如果需要大量新连接,修改它。
thread_cache_size 如果需要大量新连接,修改它。
key_buffer_size 索引页池,可以设成很大。
bdb_cache_size BDB表使用的记录和键吗高速缓存。
table_cache 如果有很多的表和并发连接,修改它。
delay_key_write 如果需要缓存所有键码写入,设置它。
log_slow_queries 找出需花大量时间的查询。
max_heap_table_size 用于GROUP BY
sort_buffer 用于ORDER BY和GROUP BY
myisam_sort_buffer_size 用于REPAIR TABLE
join_buffer_size 在进行无键吗的联结时使用。
--------------------------------------------------------------------------------
十五、优化表
MySQL拥有一套丰富的类型。你应该对每一列尝试使用最有效的类型。
ANALYSE过程可 以帮助你找到表的最优类型:SELECT * FROM table_name PROCEDURE ANALYSE()。
对于不保存NULL 值的列使用NOT NULL,这对你想索引的列尤其重要。
将ISAM类型的表改为MyISAM。
如果可能,用固定的表格式创建表。
不 要索引你不想用的东西。
利用MySQL能按一个索引的前缀进行查询的事实。如果你有索引INDEX(a,b),你不需要在a上的索引。
不 在长CHAR/VARCHAR列上创建索引,而只索引列的一个前缀以节省存储
空间。CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10)))
对每个表使用最有效的表格式。
在不同表中保存 相同信息的列应该有同样的定义并具有相同的列名。
--------------------------------------------------------------------------------
十六、MySQL如何次存储数据
数据库以目录存储。
表以文件存储。
列以变长或定长格式存储在文 件中。对BDB表,数据以页面形式存储。
支持基于内存的表。
数据库和表可在不同的磁盘上用符号连接起来。
在Windows 上,MySQL支持用.sym文件内部符号连接数据库。
--------------------------------------------------------------------------------
十七、MySQL表类型
HEAP表:固定行长的表,只存储在内存中并用HASH索引进行索引。
ISAM 表:MySQL 3.22中的早期B-tree表格式。
MyIASM:IASM表的新版本,有如下扩展: