活着的死人 发表于 2015-1-16 22:16:47

MYSQL网页编程之胪陈怎样进步MySQL中数据装载效力

如果你在一个遵循GPL的自由(开源)项目中使用MySQL,那么你可以遵循GPL协议使用MySQL。然而,如果你的项目不是在GPL协议下的话,你必须为使用MySQL来支付许可费用,或者你可能因为这个因素而将你的项目改为遵循GPL。良多时分体贴的是优化SELECT查询,由于它们是最经常使用的查询,并且断定如何优化它们其实不老是刀切斧砍。绝对来讲,将数据装进数据库是刀切斧砍的。但是,也存在可用来改良数据装载操纵效力的战略,其基础道理以下:成批装载较单行装载更快,由于在装载每一个纪录后,不必要革新索引高速缓存;可在成批纪录装进后才革新。
在表无索引古装载比索引后装载更快。假如有索引,不但必需增添纪录到数据文件,并且还要修正每一个索引以反应增添了的新纪录。
较短的SQL语句对照长的SQL语句要快,由于它们触及服务器方的剖析较少,并且还由于将它们经由过程收集从客户机发送到服务器更快。这些要素中有一些仿佛微乎其微(出格是最初一个要素),但假如要装载大批的数据,即便是很小的要素也会发生很年夜的分歧了局。我们能够使用上述的一样平常道理推导出几个关于怎样最快地装载数据的实践结论:
LOADDATA(包含其一切情势)比INSERT效力高,由于其成批装载行。索引革新较少,而且服务器只需剖析息争释一条语句而不是几条语句。
LOADDATA比LOADDATALOCAL效力更高。使用LOADDATA,文件必需定位在服务器上,并且必需具有FILE权限,但服务器可从磁盘间接读取文件。使用LOADDATALOCAL,客户机读取文件并将其经由过程收集发送给服务器,如许做很慢。
假如必需利用INSERT,应当使用同意在单个语句中指定多行的情势,比方:
可在语句中指定的行越多越好。如许会削减所需的语句数量,下降索引革新量。假如利用mysqldump天生数据库备份文件,应当利用--extended-insert选项,使转储文件包括多行INSERT语句。还可使用--opt(优化),它启用--extended-insert选项。反之,应当制止利用mysqldump的--complete-insert选项;此选项会招致INSERT语句为单行,实行工夫更长,比不必--complete-insert选项天生的语句必要更多的剖析。
利用紧缩了的客户机/服务器协定以削减收集数据流量。关于年夜多半MySQL客户机,能够用--compress命令行选项来指定。它一样平常只用于较慢的收集,由于紧缩必要占用大批的处置器工夫。
让MySQL拔出缺省值;不要在INSERT语句中指定将以恣意体例付与缺省值的列。均匀来讲,如许做语句会更短,能削减经由过程收集传送给服务器的字符数。别的,语句包括的值较少,服务器所举行的剖析和转换就会较少。
假如表是索引的,则可使用批量拔出(LOADDATA或多行的INSERT语句)来削减索引的开支。如许会最小化索引更新的影响,由于索引只必要在一切行处置过期才举行革新,而不是在每行处置后就革新。
假如必要将大批数据装进一个新表,应当创立该表且在未索引古装载,装载数据后才创立索引,如许做较快。一次创立索引(而不是每行修正一次索引)较快。
假如在装载之前删除或禁用索引,装进数据后再从头创立或启用索引大概使装载更快。假如想对数据装载利用删除或禁用战略,必定要做一些实行,看如许做是不是值得(假如将大批数据装进一个年夜表中,重修和索引所消费的工夫大概比装载数据的工夫还要长)。
可用DROPINDEX和CREATEINDEX来删除和重修索引。另外一种可供选择的办法是使用myisamchk或isamchk禁用和启用索引。这必要在MySQL服务器主机上有一个帐户,并对表文件有写进权。为了禁用表索引,可进进响应的数据库目次,实行以下命令之一:
对具有.MYI扩大名的索引文件的MyISAM表利用myisamchk,对具有.ISM扩大名的索引文件的ISAM表利用isamchk。在向表中装进数据后,按以下激活索引:
假如决意利用索引禁用和激活,应当利用第13章中先容的表修复锁定协定以制止服务器同时变动锁(固然此时不合错误表举行修复,但要对它像表修复历程一样举行修正,因而必要利用不异的锁定协定)。
上述数据装载道理也合用于与必要实行分歧操纵的客户机有关的流动查询。比方,一样平常但愿制止在频仍更新的表上长工夫运转SELECT查询。长工夫运转SELECT查询会发生大批争用,并下降写进程序的功能。一种大概的办理办法为,假如实行写进的次要是INSERT操纵,那末先将纪录存进一个一时表,然后按期地将这些纪录到场主表中。假如必要当即会见新纪录,这不是一个可行的办法。但只需能在一个较短的工夫内不会见它们,就能够利用这个办法。利用一时表有两个方面的优点。起首,它削减了与主表上SELECT查询语句的争用,因而,实行更快。其次,从一时表将纪录装进主表的总工夫较分离装载纪录的总工夫少;响应的索引高速缓存只需在每一个批量装载停止时举行革新,而不是在每行装载后革新。这个战略的一个使用是进进Web服务器的Web页会见MySQL数据库。在此情况下,大概没有包管纪录当即进进主表的较高权限。
假如数据其实不完整是那种在体系非一般封闭事务中拔出的单个纪录,那末削减索引革新的另外一战略是利用MyISAM表的DELAYED_KEY_WRITE表创立选项(假如将MySQL用于某些数据录进事情时大概会呈现这类情形)。此选项使索引高速缓存只偶然革新,而不是在每次拔出后都要革新。
假如但愿在服务器局限内使用提早索引革新,只需使用--delayed-key-write选项启动mysqld便可。在此情况下,索引块写操纵提早到必需革新块以便为其他索引值腾出空间为止,或提早到实行了一个flush-tables命令后,或提早到该索引表封闭。
DBaaS向客户提供了许多与其他云服务相类似的优势:一个灵活的、可扩展的MySQL学习教程、按需服务的平台,它以自助服务和便捷管理为导向,可以对环境中的资源进行调配。

冷月葬花魂 发表于 2015-1-19 06:31:20

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

小女巫 发表于 2015-1-26 08:51:56

可以动态传入参数,省却了动态SQL的拼写。

若相依 发表于 2015-2-4 13:56:13

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

柔情似水 发表于 2015-2-10 01:35:23

这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。

再见西城 发表于 2015-2-28 15:05:24

个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。

变相怪杰 发表于 2015-3-10 00:28:06

可以动态传入参数,省却了动态SQL的拼写。

飘飘悠悠 发表于 2015-3-17 04:00:04

我们学到了什么?思考问题的时候从表的角度来思考问

若天明 发表于 2015-3-23 18:19:31

代替了原来VB式的错误判断。比Oracle高级不少。
页: [1]
查看完整版本: MYSQL网页编程之胪陈怎样进步MySQL中数据装载效力