发一篇循规蹈矩解说MySQL数据库的功能调剂
MySQL对硬件的较低要求是其最大的优势之一,不过需要注意的是:内存越多越好,因为所有的重要数据存储都在内存中完成。MySQL的功能调剂:<Pstyle="TEXT-INDENT:2em">INSERT查询的速率:<Pstyle="TEXT-INDENT:2em">拔出一个纪录的工夫由以下构成:<Pstyle="TEXT-INDENT:2em">毗连:(3)<Pstyle="TEXT-INDENT:2em">发送查询给服务器:(2)<Pstyle="TEXT-INDENT:2em">剖析查询:(2)<Pstyle="TEXT-INDENT:2em">拔出纪录:(1x纪录巨细)<Pstyle="TEXT-INDENT:2em">拔出索引:(1x索引)<Pstyle="TEXT-INDENT:2em">封闭:(1)<Pstyle="TEXT-INDENT:2em">这里的数字有点与整体工夫成反比。这不思索翻开表的初始开支(它为每一个并发运转的查询做一次)。<Pstyle="TEXT-INDENT:2em">表的巨细以NlogN(B树)的速率减慢索引的拔出。<Pstyle="TEXT-INDENT:2em">加速拔出的一些办法:<Pstyle="TEXT-INDENT:2em">假如你同时从统一客户拔出良多行,利用多个值表的INSERT语句。这比利用分隔INSERT语句快(在一些情形中几倍)。<Pstyle="TEXT-INDENT:2em">假如你从分歧客户拔出良多行,你能经由过程利用INSERTDELAYED语句失掉更高的速率。<Pstyle="TEXT-INDENT:2em">注重,用MyISAM,假如在表中没有删除的行,能在SELECT:s正在运转的同时拔出行。<Pstyle="TEXT-INDENT:2em">当从一个文本文件装载一个表时,利用LOADDATAINFILE。这一般比利用良多INSERT语句快20倍。当表有良多索引时,有大概多做些事情使得LOADDATAINFILE更快些。利用以下历程:<Pstyle="TEXT-INDENT:2em">有选择地用CREATETABLE创立表。比方利用mysql或Perl-DBI。<Pstyle="TEXT-INDENT:2em">实行FLUSHTABLES,或外壳命令mysqladminflush-tables。<Pstyle="TEXT-INDENT:2em">利用myisamchk--keys-used=0-rq/path/to/db/tbl_name。这将从表中删除一切索引的利用。<Pstyle="TEXT-INDENT:2em">用LOADDATAINFILE把数据拔出到表中,这将不更新任何索引,因而很快。<Pstyle="TEXT-INDENT:2em">假如你有myisampack而且想要紧缩表,在它下面运转myisampack.<Pstyle="TEXT-INDENT:2em">用myisamchk-r-q/path/to/db/tbl_name再创立索引。这将在将它写进磁盘前在内存中创立索引树,而且它更快,由于制止大批磁盘寻道。了局索引树也被完善地均衡。<Pstyle="TEXT-INDENT:2em">实行FLUSHTABLES,或外壳命令mysqladminflush-tables。<Pstyle="TEXT-INDENT:2em">这个历程将被机关进在MySQL的某个将来版本的LOADDATAINFILE。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">你能够锁定你的表以减速拔出。<Pstyle="TEXT-INDENT:2em">mysql>LOCKTABLESaWRITE;mysql>INSERTINTOaVALUES(1,23),(2,34),(4,33);mysql>INSERTINTOaVALUES(8,26),(6,29);mysql>UNLOCKTABLES;次要的速率不同是索引缓冲区仅被洗濯到磁盘上一次,在一切INSERT语句完成后。一样平常有与有分歧的INSERT语句那样夺的索引缓冲区洗濯。假如你能用一个单个语句拔出一切的行,锁定就不必要。锁定也将下降多毗连测试的全体工夫,可是对某些线程最年夜守候工夫将上升(由于他们守候锁)。比方:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">thread1does1000insertsthread2,3,and4does1insertthread5does1000inserts假如你不利用锁定,2、3和4将在1和5前完成。假如你利用锁定,2、3和4将大概不在1或5前完成,可是全体工夫应当快约莫40%。由于INSERT,UPDATE和DELETE操纵在MySQL中是很快的,经由过程为多于约莫5次接二连三地拔出或更新一行的器材加锁,你将取得更好的全体功能。假如你做良多一行的拔出,你能够做一个LOCKTABLES,偶然随后做一个UNLOCKTABLES(约莫每1000行)以同意别的的线程存取表。这仍旧将招致取得好的功能。固然,LOADDATAINFILE对装载数据仍旧是更快的。需要处理因此带来的更多的支持工作,这有可能会带来成本上的提高。在这种情况下,一些MySQL学习教程发行商可能倾向于选择别的开源数据库,例如遵循BSD授权的PostgreSQL。 习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。 SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。) 但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 可以动态传入参数,省却了动态SQL的拼写。 语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的! 始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。 这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。 学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
页:
[1]