PHP[转] 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表。

相关文章