大数据优化

一、大家可以且相应优化什么?

硬件

操作系统/软件库

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/速龙平台上,用pgcc(gcc的驰骋芯片优化版)编译MySQL。可是,二进制代码将只好运行在AMD奔腾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的伯克利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表。

相关文章