[转] MySql 优化 大数据优化

1、咱们能够且应该优化什么?html

硬件mysql

操做系统/软件库ios

SQL服务器(设置和查询)web

应用编程接口(API)sql

应用程序数据库

--------------------------------------------------------------------------------编程

2、优化硬件缓存

若是你须要庞大的数据库表(>2G),你应该考虑使用64位的硬件结构,像Alpha、Sparc或即将推出的IA64。由于MySQL内部使用大量64位的整数,64位的CPU将提供更好的性能。安全

对大数据库,优化的次序通常是RAM、快速硬盘、CPU能力。服务器

更多的内存经过将最经常使用的键码页面存放在内存中能够加速键码的更新。

若是不使用事务安全(transaction-safe)的表或有大表而且想避免长文件检查,一台UPS就可以在电源故障时让系统安全关闭。

对于数据库存放在一个专用服务器的系统,应该考虑1G的以太网。延迟与吞吐量一样重要。

--------------------------------------------------------------------------------

3、优化磁盘

为系统、程序和临时文件配备一个专用磁盘,若是确是进行不少修改工做,将更新日志和事务日志放在专用磁盘上。 低寻道时间对数据库磁盘很是重要。对与大表,你能够估计你将须要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)。 对于某些特定应用,能够对某些特定表使用内存磁盘,但一般不须要。

--------------------------------------------------------------------------------

4、优化操做系统

不要交换区。若是内存不足,增长更多的内存或配置你的系统使用较少内存。 不要使用NFS磁盘(会有NFS锁定的问题)。 增长系统和MySQL服务器的打开文件数量。(在safe_mysqld脚本中加入ulimit -n #)。 增长系统的进程和线程数量。 若是你有相对较少的大表,告诉文件系统不要将文件打碎在不一样的磁道上(Solaris)。 使用支持大文件的文件系统(Solaris)。 选择使用哪一种文件系统。在Linux上的Reiserfs对于打开、读写都很是快。文件检查只需几秒种。

--------------------------------------------------------------------------------

5、选择应用编程接口

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和其余 可能不错,可咱们不用它们。

--------------------------------------------------------------------------------

6、优化应用

应该集中精力解决问题。 在编写应用时,应该决定什么是最重要的: 速度 操做系统间的可移植性 SQL服务器间的可移植性 使用持续的链接。. 缓存应用中的数据以减小SQL服务器的负载。 不要查询应用中不须要的列。 不要使用SELECT * FROM table_name... 测试应用的全部部分,但将大部分精力放在在可能最坏的合理的负载下的测试总体应用。经过以一种模块化的方式进行,你应该能用一个快速“哑模块”替代找到的瓶颈,而后很容易地标出下一个瓶颈。 若是在一个批处理中进行大量修改,使用LOCK TABLES。例如将多个UPDATES或DELETES集中在一块儿。

--------------------------------------------------------------------------------

7、应该使用可移植的应用

Perl DBI/DBD ODBC JDBC Python(或其余有广泛SQL接口的语言) 你应该只使用存在于全部目的SQL服务器中或能够很容易地用其余构造模拟的SQL构造。www.mysql.com上的Crash-me页能够帮助你。 为操做系统/SQL服务器编写包装程序来提供缺乏的功能。

--------------------------------------------------------------------------------

8、若是你须要更快的速度,你应该:

找出瓶颈(CPU、磁盘、内存、SQL服务器、操做系统、API或应用)并集中全力解决。 使用给予你更快速度/灵活性的扩展。 逐渐了解SQL服务器以便能为你的问题使用可能最快的SQL构造并避免瓶颈。 优化表布局和查询。 使用复制以得到更快的选择(select)速度。 若是你有一个慢速的网络链接数据库,使用压缩客户/服务器协议。 不要惧怕时应用的第一个版本不能完美地移植,在你解决问题时,你老是能够在之后优化它。

--------------------------------------------------------------------------------

9、优化MySQL

挑选编译器和编译选项。 位你的系统寻找最好的启动选项。 通读MySQL参考手册并阅读Paul DuBios的《MySQL》一书。(已有中文版-译注) 多用EXPLAIN SELECT、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST。 了解查询优化器的工做原理。 优化表的格式。 维护你的表(myisamchk、CHECK TABLE、 OPTIMIZE TABLE) 使用MySQL的扩展功能以让一切快速完成。 若是你注意到了你将在不少场合须要某些函数,编写MySQL UDF函数。 不要使用表级或列级的GRANT,除非你确实须要。 购买MySQL技术支持以帮助你解决问题憨笑

--------------------------------------------------------------------------------

10、编译和安装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基准测试来测试最终的二进制代码。

--------------------------------------------------------------------------------

11、维护

若是可能,偶尔运行一下OPTIMIZE table,这对大量更新的变长行很是重要。 偶尔用myisamchk -a更新一下表中的键码分布统计。记住在作以前关掉MySQL。 若是有碎片文件,可能值得将全部文件复制到另外一个磁盘上,清除原来的磁盘并拷回文件。 若是遇到问题,用myisamchk或CHECK table检查表。 用mysqladmin -i10 precesslist extended-status监控MySQL的状态。 用MySQL GUI客户程序,你能够在不一样的窗口内监控进程列表和状态。 使用mysqladmin debug得到有关锁定和性能的信息。

--------------------------------------------------------------------------------

12、优化SQL

扬SQL之长,其它事情交由应用去作。使用SQL服务器来作:

找出基于WHERE子句的行。 JOIN表 GROUP BY ORDER BY DISTINCT

不要使用SQL来作:

检验数据(如日期) 成为一只计算器

技巧:

明智地使用键码。 键码适合搜索,但不适合索引列的插入/更新。 保持数据为数据库第三范式,但不要担忧冗余信息或这若是你须要更快的速度,建立总结表。 在大表上不作GROUP BY,相反建立大表的总结表并查询它。 UPDATE table set count=count+1 where key_column=constant很是快。 对于大表,或许最好偶尔生成总结表而不是一直保持总结表。 充分利用INSERT的默认值。

--------------------------------------------------------------------------------

十3、不一样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高速缓存运行,其余数据库以默认安装运行。

--------------------------------------------------------------------------------

十4、重要的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 在进行无键吗的联结时使用。

--------------------------------------------------------------------------------

十5、优化表

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))) 对每一个表使用最有效的表格式。 在不一样表中保存相同信息的列应该有一样的定义并具备相同的列名。

--------------------------------------------------------------------------------

十6、MySQL如何次存储数据

数据库以目录存储。 表以文件存储。 列以变长或定长格式存储在文件中。对BDB表,数据以页面形式存储。 支持基于内存的表。 数据库和表可在不一样的磁盘上用符号链接起来。 在Windows上,MySQL支持用.sym文件内部符号链接数据库。

--------------------------------------------------------------------------------

十7、MySQL表类型

HEAP表:固定行长的表,只存储在内存中并用HASH索引进行索引。 ISAM表:MySQL 3.22中的早期B-tree表格式。 MyIASM:IASM表的新版本,有以下扩展: 二进制层次的可移植性。 NULL列索引。 对变长行比ISAM表有更少的碎片。 支持大文件。 更好的索引压缩。 更好的键吗统计分布。 更好和更快的auto_increment处理。 来自Sleepcat的Berkeley DB(BDB)表:事务安全(有BEGIN WORK/COMMIT|ROLLBACK)。

--------------------------------------------------------------------------------

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

若是全部列是定长格式(没有VARCHAR、BLOB或TEXT),MySQL将以定长表格式建立表,不然表以动态长度格式建立。 定长格式比动态长度格式快不少并更安全。 动态长度行格式通常占用较少的存储空间,但若是表频繁更新,会产生碎片。 在某些状况下,不值得将全部VARCHAR、BLOB和TEXT列转移到另外一个表中,只是得到主表上的更快速度。 利用myiasmchk(对ISAM,pack_iasm),能够建立只读压缩表,这使磁盘使用率最小,但使用慢速磁盘时,这很是不错。压缩表充分地利用将再也不更新的日志表

--------------------------------------------------------------------------------

十9、MySQL高速缓存(全部线程共享,一次性分配)

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

--------------------------------------------------------------------------------

二10、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表大小。

--------------------------------------------------------------------------------

二11、MySQL表高速缓存工做原理

每一个MyISAM表的打开实例(instance)使用一个索引文件和一个数据文件。若是表被两个线程使用或在同一条查询中使用两次,MyIASM将共享索引文件而是打开数据文件的另外一个实例。 若是全部在高速缓存中的表都在使用,缓存将临时增长到比表缓存尺寸大些。若是是这样,下一个被释放的表将被关闭。 你能够经过检查mysqld的Opened_tables变量以检查表缓存是否过小。若是该值过高,你应该增大表高速缓存。

--------------------------------------------------------------------------------

二12、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 复制功能

--------------------------------------------------------------------------------

二12、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

--------------------------------------------------------------------------------

二十3、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

--------------------------------------------------------------------------------

二十4、学会使用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和范围类型提示一个潜在的问题。

--------------------------------------------------------------------------------

二十5、学会使用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来杀死溜掉的线程。 --------------------------------------------------------------------------------

二十6、如何知晓MySQL解决一条查询

运行项列命令并试图弄明白其输出: SHOW VARIABLES; SHOW COLUMNS FROM ...\G EXPLAIN SELECT ...\G FLUSH STATUS; SELECT ...; SHOW STATUS;

--------------------------------------------------------------------------------

二十7、MySQL很是不错

日志 在进行不少链接时,链接很是快。 同时使用SELECT和INSERT的场合。 在不把更新与耗时太长的选择结合时。 在大多数选择/更新使用惟一键码时。 在使用没有长时间冲突锁定的多个表时。 在用大表时(MySQL使用一个很是紧凑的表格式)。

--------------------------------------------------------------------------------

二十8、MySQL应避免的事情

用删掉的行更新或插入表,结合要耗时长的SELECT。 在能放在WHERE子句中的列上用HAVING。 不使用键码或键码不够惟一而进行JOIN。 在不一样列类型的列上JOIN。 在不使用=匹配整个键码时使用HEAP表。 在MySQL监控程序中忘记在UPDATE或DELETE中使用一条WHERE子句。若是想这样作,使用mysql客户程序的--i-am-a-dummy选项。

--------------------------------------------------------------------------------

二十9、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;

--------------------------------------------------------------------------------

三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使用/忽略列出的索引。

--------------------------------------------------------------------------------

三11、事务的例子

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;

--------------------------------------------------------------------------------

三12、使用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 (...)

--------------------------------------------------------------------------------

三十3、通常技巧

使用短主键。联结表时使用数字而非字符串。 当使用多部分键码时,第一部分应该时最经常使用的部分。 有疑问时,首先使用更多重复的列以得到更好地键码压缩。 若是在同一台机器上运行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不够快,研究一下访问数据的较底层接口。

--------------------------------------------------------------------------------

三十4、使用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脚本

--------------------------------------------------------------------------------

三十5、正在积极开发的重要功能

改进事务处理 失败安全的复制 正文搜索 多个表的删除(以后完成多个表的更新) 更好的键码缓存 原子RENAME (RENAME TABLE foo as foo_old, foo_new as foo) 查询高速缓存 MERGE TABLES 一个更好的GUI客户程序

MySQL优化简明指南

--------------------------------------------------------------------------------

2004-05-25

1、在编译时优化MySQL 若是你从源代码分发安装MySQL,要注意,编译过程对之后的目标程序性能有重要的影响,不一样的编译方式可能获得相似的目标文件,但性能可能相差很大,所以,在编译安装MySQL适应仔细根据你的应用类型选择最可能好的编译选项。这种定制的MySQL能够为你的应用提供最佳性能。

技巧:选用较好的编译器和较好的编译器选项,这样应用可提升性能10-30%。(MySQL文档如是说)

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

1.二、仅使用你想使用的字符集编译MySQL MySQL目前提供多达24种不一样的字符集,为全球用户以他们本身的语言插入或查看表中的数据。却省状况下,MySQL安装全部者这些字符集,热然而,最好的选择是指选择一种你须要的。如,禁止除Latin1字符集之外的全部其它字符集:

-------------------------------------------------------------------------------- %>./configure -with-extra-charsets=none [--other-configuration-options] --------------------------------------------------------------------------------

1.三、将mysqld编译成静态执行文件 将mysqld编译成静态执行文件而无需共享库也能得到更好的性能。经过在配置时指定下列选项,可静态编译mysqld。

-------------------------------------------------------------------------------- %>./configure -with-mysqld-ldflags=-all-static [--other-configuration-options] --------------------------------------------------------------------------------

1.四、配置样本 下列配置命令经常使用于提升性能:

-------------------------------------------------------------------------------- %>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 --------------------------------------------------------------------------------

2、调整服务器 确保运用正确的编译当然重要,但这只是成功的第一步,配置众多的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]标题下插入变量设置。 3、表类型

不少MySQL用户可能很惊讶,MySQL确实为用户提供5种不一样的表类型,称为DBD、HEAP、ISAM、MERGE和MyIASM。DBD归为事务安全类,而其余为非事务安全类。

3.一、事务安全

DBD Berkeley DB(DBD)表是支持事务处理的表,由Sleepycat软件公司(http://www.sleepycat.com)开发。它提供MySQL用户期待已久的功能-事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,由于它们确保一组命令能成功地执行。

3.二、非事务安全

HEAP

HEAP表是MySQL中存取数据最快的表。这是由于他们使用存储在动态内存中的一个哈希索引。另外一个要点是若是MySQL或服务器崩溃,数据将丢失。

ISAM

ISAM表是早期MySQL版本的缺省表类型,直到MyIASM开发出来。建议不要再使用它。

MERGE

MERGE是一个有趣的新类型,在3.23.25以后出现。一个MERGE表其实是一个相同MyISAM表的集合,合并成一个表,主要是为了效率缘由。这样能够提升速度、搜索效率、修复效率并节省磁盘空间。

MyIASM

这是MySQL的缺省表类型。它基于IASM代码,但有不少有用的扩展。MyIASM比较好的缘由:

MyIASM表小于IASM表,因此使用较少资源。 MyIASM表在不一样的平台上二进制层可移植。 更大的键码尺寸,更大的键码上限。 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.四、更多的表类型

为了使MySQL管理工做更有趣,即将发布的MySQL 4.0将提供两种新的表类型,称为Innobase和Gemeni。

四、优化工具

MySQL服务器自己提供了几条内置命令用于帮助优化。

4.一、SHOW

你可能有兴趣知道MySQL服务器究竟更了什么,下列命令给出一个总结:

-------------------------------------------------------------------------------- mysql>show status; --------------------------------------------------------------------------------

它给出了一个至关长的状态变量及其值的列表。有些变量包含了异常终止客户的数量、异常终止链接的数量、链接尝试的次数、最大并发链接数和大量其余有用的信息。这些信息对找出系统问题和低效极具价值。 SHOW还能作更多的事情。它能够显示关于日志文件、特定数据库、表、索引、进程和权限表中有价值的信息。详见MySQL手册。

4.二、EXPLAIN

当你面对SELECT语句时,EXPLAIN解释SELECT命令如何被处理。这不只对决定是否应该增长一个索引,并且对决定一个复杂的Join如何被MySQL处理都是有帮助的。

4.三、OPTIMIZE

OPTIMIZE语句容许你恢复空间和合并数据文件碎片,对包含变长行的表进行了大量更新和删除后,这样作特别重要。OPTIMIZE目前只工做于MyIASM和BDB表。

相关文章
相关标签/搜索