C++[转] MySql 优化 大数量优化

相同、我们可以且当优化什么?

硬件

操作系统/软件库

SQL服务器(设置以及询问)

动用编程接口(API)

应用程序


老二、优化硬件

倘你用大之多少库表(>2G),你应有考虑下64各类的硬件结构,像Alpha、Sparc或将要生产的IA64。因为MySQL内部使用大量64个之平头,64个的CPU将提供再好的属性。

对大数据库,优化的先后一般是RAM、快速硬盘、CPU能力。

再次多之内存通过将最常用的键码页面存放在内存中可以加速键码的翻新。

要是未动工作安全(transaction-safe)的表或有大表并且想避免免长文件检查,一玉UPS就会以电源故障时受系统安全关闭。

对于数据库存放于一个专用服务器的系,应该考虑1G的因为太网。延迟与吞吐量同样关键。


老三、优化磁盘

也系统、程序及临时文件配备一个专用磁盘,如果实在是进行过多改动工作,将创新日志与业务日志放在专用磁盘上。
低寻道时间对数据库磁盘非常重要。对同大表,你得估计您用急需log(行数)/log(索引块长度/3*2/(键码长度

  • 多少指针长度))+1次于搜索到才能够找到一行。对于发生500000实行之阐明,索引Mediun
    int类型的排,需要log(500000) / log(1024/3*2/(3 +
    2))+1=4软寻道。上述索引需要500000*7*3/2=5.2M底长空。实际上,大多数片用受缓存,所以大概只有待1-2涂鸦寻道。
    然而对于写入(如达到),你拿用4不成寻道请求来找到以乌存放新键码,而且貌似要2坏寻道来更新索引并勾画副一行。
    对于生非常的数据库,你的采取将受到磁盘寻道速度的限制,随着数据量的增加呈N
    log N数据级递增。
    将数据库暨表分在不同之磁盘上。在MySQL中,你可以呢这个要使用标志链接。
    条列磁盘(RAID 0)将增进读与描写的吞吐量。 带镜像的条列(RAID
    0+1)将再度安全并加强读取的吞吐量。写副的吞吐量将具备下降。
    不要对临时文件或可生轻地重建的数额所在的磁盘使用镜像或RAID(除了RAID
    0)。 在Linux上,在引时对磁盘使用命令hdparm -m16
    -d1因启用同时读写多单扇区和DMA功能。这可用应时间增长5~50%。
    在Linux上,用async (默认)和noatime挂载磁盘(mount)。
    对于一些特定应用,可以针对少数特定表使用内存磁盘,但一般不需要。

季、优化操作系统

不要交换区。如果内存不足,增加又多的内存还是部署你的系应用于少内存。
不要用NFS磁盘(会时有发生NFS锁定的题材)。
增加系统及MySQL服务器的开拓文件数量。(在safe_mysqld脚本中加入ulimit -n
#)。 增加系统的长河同线程数量。
如果你出相对较少之大表,告诉文件系统不要以文件打碎在不同之磁道上(Solaris)。
使用支持大文件的文件系统(Solaris)。
选择使用啊种文件系统。在Linux上的Reiserfs对于打开、读写都蛮急匆匆。文件检查才需要几秒种。


五、选择采取编程接口

PERL 可每当不同的操作系统和数据库中移植。 适宜快速原型。
应该使DBI/DBD接口。 PHP 比PERL易学。 使用比PERL少的资源。
通过升级至PHP4可以取更快的速。 C MySQL的原生接口。
较快并施更多的控制。 低层,所以要提交再多。 C++
较高层次,给你再次多之日来编排应用。 仍当开发被 ODBC
运行于Windows和Unix上。 几乎可在不同的SQL服务器中移植。
较缓。MyODBC只是概括的直通驱动程序,比用原生接口慢19%。
有众多方式做相同的从事。很不便像许多ODBC驱动程序那样运行,在不同的园地还有不同之错。
问题成堆。Microsoft偶尔还会见转移接口。
不明朗的前景。(Microsoft更推崇OLE而非ODBC) ODBC 运行在Windows和Unix上。
几乎可每当不同之SQL服务器间移植。
较迟缓。MyODBC只是简约的通驱动程序,比用原生接口慢19%。
有好多艺术做一样的转业。很不便像许多ODBC驱动程序那样运行,在不同之天地还有不同的左。
问题成堆。Microsoft偶尔还见面改接口。
不明朗的前途。(Microsoft更推崇OLE而非ODBC) JDBC
理论及只是于不同之操作系统何时准库间移植。 可以运行于web客户端。
Python和外 可能是,可我们绝不其。


六、优化利用

该集中精力解决问题。 在编写应用时,应该控制什么是极致要之: 速度
操作系统中的可移植性 SQL服务器中的可移植性 使用持续的连接。.
缓存应用被的数目因减少SQL服务器的载重。 不要查询利用被不需要的排列。
不要使SELECT * FROM table_name…
测试用之拥有片段,但拿多数精力在在或极端可怜之成立之负荷下的测试整体采用。通过以平等栽模块化的方法进行,你应该会就此一个飞速“哑模块”替代找到的瓶颈,然后死容易地标明出下一个瓶颈。
如果当一个批判处理着开展大气窜,使用LOCK
TABLES。例如将多单UPDATES或DELETES集中在并。


七、应该下可移栽的使用

Perl DBI/DBD ODBC JDBC Python(或其它产生广泛SQL接口的语言)
你当单独利用是叫具有目的SQL服务器遭到要可以充分易地用其他组织模拟的SQL构造。www.mysql.com上的Crash-me页可以拉而。
为操作系统/SQL服务器编写包装程序来提供缺少的功效。


八、如果你需要重新快之速,你应当:

查找来瓶颈(CPU、磁盘、内存、SQL服务器、操作系统、API或用)并集中用力化解。
使用与你又快速度/灵活性的壮大。
逐渐了解SQL服务器以便能为而的问题下或者不过抢之SQL构造并避免瓶颈。
优化表布局和查询。 使用复制以得到重新快之选择(select)速度。
如果你出一个慢速的网络连接数据库,使用压缩客户/服务器协议。
不要怕时行使之首先只版本不克完美地移植,在公解决问题时,你总是可以在后优化其。


九、优化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表的新本子,有如下扩展:
二前行制层次之可移植性。 NULL列索引。 对变长行比ISAM表有再不见之零散。
支持好文件。 更好的目录压缩。 更好之键吗统计分布。
更好与再次快的auto_increment处理。 来自Sleepcat的Berkeley
DB(BDB)表:事务安全(有BEGIN WORK/COMMIT|ROLLBACK)。


十八、MySQL行类型(专指IASM/MyIASM表)

设若拥有列是定长格式(没有VARCHAR、BLOB或TEXT),MySQL将以定长表格式创建表,否则表以动态长度格式创建。
定长格式比动态长度格式快多并再安全。
动态长度行格式一般占比较少之贮存空间,但若是表频繁更新,会来碎片。
在某些情况下,不值得以有所VARCHAR、BLOB和TEXT列转移到其它一个表中,只是取得主表上之再快速度。
利用myiasmchk(对ISAM,pack_iasm),可以创造只念压缩表,这如磁盘使用率最小,但用慢速磁盘时,这可怜科学。压缩表充分地运将不再更新的日志表


十九、MySQL高速缓存(所有线程共享,一次性分配)

键码缓存:key_buffer_size,默认8M。 表缓存:table_cache,默认64。
线程缓存:thread_cache_size,默认0。
主机名缓存:可每当编译时修改,默认128。 内存映射表:目前独自用于压缩表。
注意:MySQL没有运行高速缓存,而给操作系统处理。


二十、MySQL缓存区变量(非共享,按需分配)

sort_buffer:ORDER BY/GROUP BY record_buffer:扫描表。
join_buffer_size:无键联结 myisam_sort_buffer_size:REPAIR TABLE
net_buffer_length:对于读SQL语句并缓存结果。
tmp_table_size:临时结果的HEAP表大小。


二十一、MySQL表高速缓存工作规律

每个MyISAM表的开辟实例(instance)使用一个目文件与一个数据文件。如果表被简单独线程使用还是当同样条查询中应用简单次,MyIASM将联名享索引文件而是打开数据文件的别一个实例。
如果具有在高速缓存中的表都在运,缓存将现增至比表缓存尺寸大些。如果是这样,下一个为释放的表将被关闭。
你得透过检查mysqld的Opened_tables变量以检讨表缓存是否尽小。如果该值太强,你应当增大表高速缓存。


二十二、MySQL扩展/优化-提供更快之快慢

应用优化的表类型(HEAP、MyIASM或BDB表)。 对数码利用优化的排。
如果可能行使得长行。 使用不同的锁定类型(SELECT HIGH_PRIORITY,INSERT
LOW_PRIORITY) Auto_increment REPLACE (REPLACE INTO table_name VALUES
(…)) INSERT DELAYED LOAD DATA INFILE / LOAD_FILE()
使用多履行INSERT一浅栽多行。 SELECT INTO OUTFILE LEFT JOIN, STRAIGHT
JOIN LEFT JOIN ,结合IS NULL ORDER BY可于一些情况下用键码。
如果光询问在一个目录中之排,将只是使索引树解决查询。
联结一般比子查询快(对大部分SQL服务器也如此)。 LIMIT SELECT * from
table1 WHERE a > 10 LIMIT 10,20 DELETE * from table1 WHERE a > 10
LIMIT 10 foo IN (常数列表) 高度优化。 GET_LOCK()/RELEASE_LOCK() LOCK
TABLES INSERT和SELECT可又运行。 UDF函数可装载上一个正在运转的服务器。
压缩只读表。 CREATE TEMPORARY TABLE CREATE TABLE .. SELECT
带RAID选项的MyIASM表将文件分割成多文件为突破某些文件系统的2G限制。
Delay_keys 复制功能


二十二、MySQL何时使用索引

针对一个键码使用>, >=, =, <, <=, IF NULL和BETWEEN SELECT *
FROM table_name WHERE key_part1=1 and key_part2 > 5; SELECT *
FROM table_name WHERE key_part1 IS NULL;

当使用非以属配符开始之LIKE SELECT * FROM table_name WHERE key_part1
LIKE ‘jani%’

每当拓展联合时于外一个表中提取行时 SELECT * from t1,t2 where
t1.col=t2.key_part

寻有指定索引的MAX()或MIN()值 SELECT MIN(key_part2),MAX(key_part2) FROM
table_name where key_part1=10

一个键码的前缀使用ORDER BY或GROUP BY SELECT * FROM foo ORDER BY
key_part1,key_part2,key_part3

在拥有用在查询中之排是键码的平等片时间 SELECT key_part3 FROM
table_name WHERE key_part1=1


二十三、MySQL何时休采用索引

而MySQL能估计起她以可能比较扫描整张表还要快时,则非使索引。例如如果key_part1通通匀分布在1与100里头,下列查询中采取索引就无是死好:
SELECT * FROM table_name where key_part1 > 1 and key_part1 <
90

只要采用HEAP表且不用=搜索所有键码部分。

当HEAP表上行使ORDER BY。

如若非是用键码第一有的 SELECT * FROM table_name WHERE key_part2=1

设若下以一个通配符开始的LIKE SELECT * FROM table_name WHERE
key_part1 LIKE ‘%jani%’

查找一个目录而于另一个目录上开ORDER BY SELECT * from table_name WHERE
key_part1 = # ORDER BY key2


二十四、学会使用EXPLAIN

对此各级一样漫漫你当太慢的查询使用EXPLAIN!

mysql> explain select t3.DateOfAction, t1.TransactionID -> from t1
join t2 join t3 -> where t2.ID = t1.TransactionID and t3.ID =
t2.GroupID -> order by t3.DateOfAction, t1.TransactionID;
+——-+——–+—————+———+———+——————+——+———————————+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+——-+——–+—————+———+———+——————+——+———————————+
| t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using
filesort | | t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | | | t3 |
eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | |
+——-+——–+—————+———+———+——————+——+———————————+

ALL和限量类型提示一个秘的问题。


二十五、学会用SHOW PROCESSLIST

运用SHOW processlist来发现在召开呀:
+—-+——-+———–+—-+———+——+————–+————————————-+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——-+———–+—-+———+——+————–+————————————-+
| 6 | monty | localhost | bp | Query | 15 | Sending data | select *
from station,station as s1 | | 8 | monty | localhost | | Query | 0 | |
show processlist |
+—-+——-+———–+—-+———+——+————–+————————————-+

当mysql或mysqladmin中之所以KILL来杀死溜掉的线程。

二十六、如何知晓MySQL解决一修查询

运作项列命令并试图将明白该出口: SHOW VARIABLES; SHOW COLUMNS FROM
…\G EXPLAIN SELECT …\G FLUSH STATUS; SELECT …; SHOW STATUS;


二十七、MySQL非常对

日志 在进展多一连时,连接老急匆匆。 同时以SELECT和INSERT的场子。
在无将创新与耗时太长的选组合时。 在多数拣/更新使用唯一键码时。
在采用无长日子冲突锁定的多个表时。
在就此大表时(MySQL使用一个特别紧密的表格式)。


二十八、MySQL应避免的事体

为此删掉的行更新或插队入表,结合而耗时长之SELECT。
在力所能及放在WHERE子句被的列上用HAVING。 不利用键码或键码不够唯一要进展JOIN。
在不同列类型的列上JOIN。 在未行使=匹配整个键码时使用HEAP表。
在MySQL监控程序中忘记在UPDATE或DELETE中以同样条WHERE子句。如果想然做,使用mysql客户程序的–i-am-a-dummy选项。


二十九、MySQL各种锁定

里头表锁定 LOCK TABLES(所有表类型适用) GET LOCK()/RELEASE LOCK()
页面锁定(对BDB表) ALTER TABLE也于BDB表上进行表锁定 LOCK
TABLES允许一个表有多独读者及一个写者。
一般WHERE锁定具有比READ锁定高之事先级因避免被写副方干等。对于非紧要之描摹入方,可以利用LOW_PRIORITY关键字让锁定处理器优选读取方。
UPDATE LOW_PRIORITY SET value=10 WHERE id=10;


三十、给MySQL更多信息以更好地解决问题的艺

留神你毕竟能够去丢(加注)MySQL功能以使查询而移栽:

SELECT /*! SQL_BUFFER_RESULTS */ … SELECT SQL_BUFFER_RESULTS …
将强制MySQL生成一个现结果集。只要拥有临时结果集生成后,所有表上的锁定均于释放。这能够以撞表锁定问题经常或者如花好丰富时用结果传于客户端时有所帮助。
SELECT SQL_SMALL_RESULT … GROUP BY …
告诉优化器结果集将独自含有很少之行。 SELECT SQL_BIG_RESULT … GROUP BY
… 告诉优化器结果集将涵盖很多行。 SELECT STRAIGHT_JOIN …
强制优化器以起在FROM子句被之顺序联结表。 SELECT … FROM table_name
[USE INDEX (index_list) | IGNORE INDEX (index_list)] table_name2
强制MySQL使用/忽略列有的目。


三十一、事务的例子

MyIASM表如何开展事务处理: mysql> LOCK TABLES trans READ, customer
WRITE; mysql> select sum(value) from trans where
customer_id=some_id; mysql> update customer set
total_value=sum_from_previous_statement where customer_id=some_id;
mysql> UNLOCK TABLES;

BDB表如何开展业务: mysql> BEGIN WORK; mysql> select sum(value)
from trans where customer_id=some_id; mysql> update customer set
total_value=sum_from_previous_statement where customer_id=some_id;
mysql> COMMIT;

留神你得透过下列语句回避事务: UPDATE customer SET
value=value+new_value WHERE customer_id=some_id;


三十二、使用REPLACE的例子

REPLACE的效应最像INSERT,除了如一致长老记录在一个唯一索引上享有跟新记录相同之值,那么老记录在新记录插入前则为剔除。不利用

SELECT 1 FROM t1 WHERE key=# IF found-row LOCK TABLES t1 DELETE FROM t1
WHERE key1=# INSERT INTO t1 VALUES (…) UNLOCK TABLES t1; ENDIF

而用 REPLACE INTO t1 VALUES (…)


三十三、一般技巧

使用短主键。联结表时使用数字要休字符串。
当使用多片键码时,第一片应时时不过常用之有些。
有问题时,首先以还多重复的排以博得更好地键码压缩。
如果在同台机械及运行MySQL客户与服务器,那么当连MySQL时则以模拟接字而未是TCP/IP(这可增长性7.5%)。可当连接MySQL服务器时不点名主机名或主机名也localhost来就。
如果可能,使用–skip-locking(在一些OS上也默认),这将关闭外部锁定并拿增强性。
使用使用层哈希值而非长键码: SELECT * FROM table_name WHERE
hash=MD5(concat(col1,col2)) AND col_1=’constant’ AND col_2=’constant’

每当文书中保存要为文件形式拜访的BLOB,在数据库中不过保留文件称。
删除所有行比删除一可怜统分行要赶快。
如果SQL不足够快,研究一下访数的比底层接口。


三十四、使用MySQL 3.23的好处

MyISAM:可移栽的大表格式 HEAP:内存中的表 Berkeley DB:支持工作之说明。
众多增强的限 动态字符集 更多之STATUS变量 CHECK和REPAIR表 更快的GROUP
BY和DISTINCT LEFT JOIN … IF NULL的优化 CREATE TABLE … SELECT CREATE
TEMPORARY table_name (…) 临时HEAP表到MyISAM表的全自动转换 复制
mysqlhotcopy脚本


三十五、正在主动开发之重中之重成效

改善事务处理 失败安全的复制 正文搜索 多个说明底删减(之后形成差不多单说明的更新)
更好之键码缓存 原子RENAME (RENAME TABLE foo as foo_old, foo_new as
foo) 查询高速缓存 MERGE TABLES 一个重复好之GUI客户程序

MySQL优化简明指南


2004-05-25

同、在编译时优化MySQL
如果您于源代码分发安装MySQL,要留心,编译过程对下的目标程序性能有主要的影响,不同之编译方式可能获得近似之对象文件,但性能可能去大挺,因此,在编译安装MySQL适应仔细根据你的使类选择最为可能好之编译选项。这种定制的MySQL可以呢卿的下提供最佳性能。

艺:选用较好之编译器和比较好的编译器选项,这样使可加强性10-30%。(MySQL文档如是说)

1.1、使用pgcc(Pentium GCC)编译器 该编译器(http://www.goof.com/pcg/)针对运行?…继谙低成杓频摹?

1.2、仅用你想用的字符集编译MySQL
MySQL目前供多上24种植不同的字符集,为中外用户为她们友善之言语插入或查看表中的多寡。却看气象下,MySQL安装所有者这些字符集,热然而,最好的选是因选择一样栽而需要之。如,禁止除Latin1字符集以外的享有其他字符集:


%>./configure -with-extra-charsets=none

[–other-configuration-options]

1.3、将mysqld编译成静态执行文书
将mysqld编译成静态执行文书要随便需一并享库也克赢得更好的性质。通过当布局时指定下列选项,可静态编译mysqld。


%>./configure -with-mysqld-ldflags=-all-static

[–other-configuration-options]

1.4、配置样本 下列配置命令时用来加强性能:


%>CFLAGS=”-O6 -mpentiumpro -fomit-frame-pointer” CXX=gcc
CXXFLAGS=”-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors
-fno-exceptions -fno-rtti” ./configure –prefix=/usr/local

–enable-assembler –with-mysqld-ldflags=-all-static –disable-shared

次、调整服务器
确保下是的编译固然要,但当时单是打响之首先步,配置众多之MySQL变量同样对服务器的例行运作于关键作用。你可以以这些变量的赋值存在一个布局文件中,以保证其当每次启动MySQL时均打作用,这个布局文件就是my.cnf文件。

MySQL已经提供了几只my.cnf文件之范本,可在/usr/local/mysqld/share/mysql/目录下找到。这些文件分别命名也
my-small.cnf、
my-medium.cnf、my-large.cnf和my-huge.cnf,规模说明可在叙述配置文件适用的系项目题中找到。如果以仅出一定少内存的网及运行MySQL,而且只是偶然的所以一下,那么my-small.cnf会比较良好,因为她命令mysqld只使用最少之资源。类似地,如果您计划构建电子商务超市,而且系统有着2G内存,那么您也许而用到mysql-huge.cnf文件了。

为使这些文件被之一个,你待复制一个绝契合需要的文本,改名为my.cnf。你可以选择用安排文件三种意向范围的同等栽:

Global:将my.cnf文件复制到服务器的/etc目录下,这使配置文件中之变量作用为大局,即针对具备服务器上的MySQL数据库服务器中。
Local:将my.cnf文件复制到[MYSQL-INSTALL-DIR]/var/目录下,使得my.cnf作用为特定的服务器。[MYSQL-INSTALL-DIR]意味着MySQL安装目录。
User:你可以重新克作用被特定的用户,将my.cnf复制到用户之彻底目录下。
究竟如何设置my.cnf中之这些变量呢?更进一步说,你得设置哪一个变量。虽然所用变量对MySQL服务器相对通用,每一个变量和MySQL的之一点零部件有再度特定的关系。如变量max_connects归在mysqld类别下。执行下列命令即可知道:


%>/usr/local/mysql/libexec/mysqld –help

她显示大量的选取和与mysqld相关的变量。你得十分容易地在该行文字之下找来变量:


Possible variables for option –set-variable (-O) are

下一场你得如下设置my.cnf中的那些变量:


set-variable = max_connections=100

它装MySQL服务器的顶酷并发连接数为100。要保管以my.cnf文件被的[mysqld]题下插入变量设置。
三、表类型

有的是MySQL用户或很怪,MySQL确实也用户提供5种不同的表类型,称为DBD、HEAP、ISAM、MERGE和MyIASM。DBD归为工作安全类,而另为非事务安全类。

3.1、事务安全

DBD Berkeley DB(DBD)表是支持事务处理的说明,由Sleepycat软件公司(http://www.sleepycat.com)开发。它提供MySQL用户期待已久的功用-事务控制。事务控制在其他数据库系统遭到都是一个无限有价的职能,因为其确保同等组命令能打响地执行。%E5%BC%80%E5%8F%91%E3%80%82%E5%AE%83%E6%8F%90%E4%BE%9Bmysql%E7%94%A8%E6%88%B7%E6%9C%9F%E5%BE%85%E5%B7%B2%E4%B9%85%E7%9A%84%E5%8A%9F%E8%83%BD-%E4%BA%8B%E5%8A%A1%E6%8E%A7%E5%88%B6%E3%80%82%E4%BA%8B%E5%8A%A1%E6%8E%A7%E5%88%B6%E5%9C%A8%E4%BB%BB%E4%BD%95%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E4%B8%AD%E9%83%BD%E6%98%AF%E4%B8%80%E4%B8%AA%E6%9E%81%E6%9C%89%E4%BB%B7%E5%80%BC%E7%9A%84%E5%8A%9F%E8%83%BD%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%AE%83%E4%BB%AC%E7%A1%AE%E4%BF%9D%E4%B8%80%E7%BB%84%E5%91%BD%E4%BB%A4%E8%83%BD%E6%88%90%E5%8A%9F%E5%9C%B0%E6%89%A7%E8%A1%8C%E3%80%82/)

3.2、非事务安全

HEAP

HEAP表是MySQL中存取数据最抢的阐明。这是以她俩采取存储在动态内存中的一个哈希索引。另一个中心是要MySQL或服务器崩溃,数据以遗失。

ISAM

ISAM表是头MySQL版本的缺省表类型,直到MyIASM开发出。建议不要再次使她。

MERGE

MERGE是一个幽默的新路,在3.23.25事后出现。一个MERGE表实际上是一个如出一辙MyISAM表的集,合并成一个表,主要是为效率原因。这样可以增强速度、搜索频率、修复效率并节约磁盘空间。

MyIASM

及时是MySQL的缺省表类型。它基于IASM代码,但来过多管用之扩张。MyIASM比较好之由来:

MyIASM表小于IASM表,所以利用比较少资源。
MyIASM表在不同的平台达成第二进制层可移栽。 更老的键码尺寸,更怪之键码上限。
3.3、指定表类型

你可在创造表时指定表的项目。下例创建一个HEAP表:


mysql>CREATE TABLE email_addresses TYPE=HEAP ( ->email char(55)
NOT NULL, ->name char(30) NOT NULL, ->PRIMARY KEY(email) );


BDB表需要一些布置工作,参见http://www.mysql.com/doc/B/D/BDB\_overview.html。

3.4、更多的表类型

以使MySQL管理工作更有意思,即将发布的MySQL
4.0将提供零星种新的表类型,称为Innobase和Gemeni。

4、优化工具

MySQL服务器本身提供了几乎漫长内置命令用于扶持优化。

4.1、SHOW

汝恐怕产生趣味知道MySQL服务器究竟还了哟,下列命令于闹一个总:


mysql>show status;

它们为闹了一个一定丰富的状态变量及其值的列表。有些变量包含了老大终止客户之多寡、异常终止连接的多寡、连接尝试的次数、最酷并发连接数和大度其他有效的音讯。这些信息对找来系统问题与废极具价值。
SHOW还能够做还多的事情。它好显得关于日志文件、特定数据库、表、索引、进程与权力表中生价之音讯。详见MySQL手册。

4.2、EXPLAIN

当你给SELECT语句时,EXPLAIN解释SELECT命令如何为处理。这不但针对控制是否合宜增加一个目,而且针对性控制一个繁杂的Join如何被MySQL处理还是生帮带的。

4.3、OPTIMIZE

OPTIMIZE语句子允许而回复空间及联合数据文件碎片,对含有变长行的申展开了大气创新和去后,这样做特别要。OPTIMIZE时单独工作于MyIASM和BDB表。