谁可相欹 发表于 2015-1-16 20:10:34

发布MySQL改良数据装载操纵效力的战略

对免费版的用户也具有充足的支持服务。在dev.mysql.com上,一个大型的MySQL学习教程强大社区用户和开发者可以讨论所有关于MySQL的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。本文先容MySQL改良数据装载操纵效力的战略。多时分体贴的是优化SELECT查询,由于它们是最经常使用的查询,并且断定如何优化它们其实不老是刀切斧砍。绝对来讲,将数据装进数据库是刀切斧砍的。  多时分体贴的是优化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命令后,或提早到该索引表封闭。
由于MySQL数据库已经如此普及,对企业来说它无疑是一个更好的选择。

透明 发表于 2015-1-18 18:19:08

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

仓酷云 发表于 2015-1-26 12:58:57

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

再见西城 发表于 2015-2-4 17:05:55

光写几个SQL实在叫无知。

只想知道 发表于 2015-2-10 04:57:46

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

精灵巫婆 发表于 2015-2-28 20:50:26

这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?

深爱那片海 发表于 2015-3-10 07:59:55

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

海妖 发表于 2015-3-17 06:03:17

备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。

柔情似水 发表于 2015-3-23 22:46:58

同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
页: [1]
查看完整版本: 发布MySQL改良数据装载操纵效力的战略