很多时候,我们关心优化选择查询,因为它们是最常用的查询,并且确定如何优化它们并不总是简单明了的。相对而言,将数据加载到数据库中很简单。但是,也有一些策略可以用来提高数据加载操作的效率。它们的基本原则如下:
批量加载比单行加载快,因为加载每条记录后不需要刷新索引缓存;只有在加载批记录后才能刷新。
表没有索引时加载比有索引后加载要快。如果有索引,您不仅必须将记录添加到数据文件中,还必须修改每个索引以反映添加的新记录。
较短的SQL语句比较长的SQL语句更快,因为它们在服务器端涉及较少的分析,并且通过网络将它们从客户端发送到服务器更快。其中一些因素看起来无关紧要(尤其是最后一个),但如果要加载大量数据,即使是很小的因素也会产生非常不同的结果。我们可以使用上面的一般原则推导出几个关于如何最快加载数据的实用结论:
LOAD DATA(包括它的所有表单)比INSERT更有效,因为它成批地加载行。索引刷新少,服务器只需要分析解释一条语句,而不是几条语句。
加载数据比本地加载数据更有效。对于加载数据,文件必须位于服务器上,并且具有文件权限,但是服务器可以直接从磁盘读取文件。使用LOAD DATA LOCAL,客户端读取文件并通过网络将其发送到服务器,速度较慢。
如果必须使用INSERT,应该利用允许在一条语句中指定多行的形式,例如:
在一条语句中可以指定的行数越多越好。这将减少所需语句和索引刷新的数量。如果使用mysqldump生成数据库备份文件,应该使用- extended-INSERT选项使转储文件包含多行INSERT语句。您还可以使用- o p t(优化),这将启用- extended-insert选项。相反,应该避免mysqldump的- complete-insert选项;该选项将导致INSERT语句成为单行,执行时间更长,并且比不使用- complete-insert选项生成的语句需要更多的分析。
压缩客户端/服务器协议用于减少网络数据流量。对于大多数MySQL客户端,可以使用- compress命令行选项来指定。一般只在慢速网络中使用,因为压缩会占用大量处理器时间。
让MySQL插入默认值;不要在INSERT语句中以任何方式指定将被赋予默认值的列。平均而言,该语句会更短,通过网络传输到服务器的字符数也会减少。此外,语句包含的值更少,因此服务器将进行更少的分析和转换。
如果对表进行了索引,可以使用bulk INSERT (LOAD DATA或多行INSERT语句)来减少索引的开销。这将最小化索引更新的影响,因为索引只需要在所有行都处理过时时刷新,而不是在处理完每一行之后。
如果需要将大量数据加载到一个新表中,应该创建该表,并在没有索引时加载它。在创建索引之前加载数据会更快。创建一次索引会更快(而不是每行修改一次索引)。
如果在加载前删除或禁用索引,则在加载数据后重新创建或启用索引可能会加快加载速度。如果您想使用删除或禁用策略进行数据加载,请务必做一些实验,看看是否值得(如果将少量数据加载到一个大表中,重建和索引可能比加载数据需要更长的时间)。
DROP INDEX和CREATE INDEX可用于删除和重建索引。另一种方法是使用myisamchk或isamchk禁用和启用索引。这需要MySQL服务器主机上的帐户和对表文件的写访问权限。要禁用表索引,可以进入相应的数据库目录并执行以下命令之一:
将MYIsamchk用于索引文件的MyISAM表。的索引文件的isam表的myi扩展名和ISAMchk。ISM扩展。将数据加载到表中后,按如下方式激活索引:
如果决定禁用和激活索引,应该使用第13章介绍的表修复锁定协议,防止服务器同时更改锁(虽然此时不修复表,但应该像表修复过程一样进行修改,所以需要使用相同的锁定协议)。
上述数据加载原则也适用于与需要执行不同操作的客户端相关的固定查询。例如,通常希望避免在频繁更新的表上长时间运行SELECT查询。长时间运行SELECT查询会产生大量争用,降低编写器的性能。一种可能的解决方案是,如果写操作主要是插入操作,则记录将首先存储在临时表中,然后这些记录将定期添加到主表中。如果您需要立即访问新记录,这不是一个可行的方法。但是只要短时间不去拜访他们,就可以用这个方法。使用临时表有两个好处。首先,它减少了与主表上的SELECT查询语句的争用,因此执行速度更快。其次,从临时表加载记录到主表的总时间少于单独加载记录的时间。相应的索引缓存只需要在每次批量加载结束时刷新,而不是在每次加载后刷新。该策略的一个应用是通过进入Web服务器的网页来访问MySQL数据库。在这种情况下,可能没有更高的权限来确保记录立即进入主表。
如果数据不完全是系统异常关机事件中插入的单个记录,另一个减少索引刷新的策略是使用MyISAM表的DELAYED_KEY_WRITE表创建选项(如果使用MySQL进行一些数据录入工作,可能会出现这种情况)。此选项导致索引缓存只是偶尔刷新,而不是在每次插入后刷新。
如果您想在服务器范围内使用延迟索引刷新,只需用-delayed-key-write选项启动mysqld。在这种情况下,索引块写入操作被延迟,直到必须刷新该块以便为其他索引值空腾出空间,或者在执行flush-tables命令之后,或者直到索引表被关闭。
关键词:MySQL
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227218.html