提高MySQL中数据加载的效率

相反,将数据加载到数据库是很简单的,然而,还有一种策略可以用来提高数据加载操作的效率。基本原则如下:

批处理加载比单行加载快,因为它在加载每个记录之后不需要刷新索引缓存;只有在批记录加载之后才可以刷新。

加载表后未加载索引时加载比索更快,如果有索引,不仅需要将记录增加到数据文件,还需要修改每个索引以反映添加的新记录。

The shorter SQL statements are faster than the longer SQL statements, because they involve less analysis of the server side, and also send them faster from the client to the server through the network.Some of these factors seem insignificant (especially the last factor), but even if they are loaded with large amounts of data, even a very small factor will lead to quite different results.We can use the general principles above to derive some practical conclusions about how to load the data quickly.

负载数据(包括所有表单)由于其批量加载行,比插入效率更高。索引刷新较少,服务器只需要分析和解释语句,而不需要几个语句。

负载数据比本地负载数据更高效。加载数据时,文件必须位于服务器上,必须具有文件权限,但服务器可以直接从磁盘读取文件。使用本地的负载数据,客户机读取文件并将其发送到服务器,这是非常慢的。

如果必须使用INSERT,则应使用允许在单个语句中指定多行的表单,例如:

越线你在声明中指定更好。这样可以减少报表数量要求和减少量的指数刷新。如果你使用mysqldump生成的数据库备份文件,你应该使用扩展插入选项使转储文件包含多行插入语句。它也可以使用O P T(优化),使扩展插入选项。相反,我们应该避免使用完全插入选项mysqldump。此选项使INSERT语句成为单行,并执行较长的时间,这需要比未生成的语句(即完全插入选项)需要更多的分析。

使用压缩的客户机/服务器协议来减少网络数据流量。对于大多数MySQL客户机,您可以用压缩命令行选项来指定。它通常只用于慢速网络,因为压缩需要大量的处理器时间。

让MySQL插入默认值;不指定在插入语句,将赋予任何默认值的列。就平均而言,这个声明会更短,可以减少字符数通过网络传输到服务器。此外,声明包含较少的价值,并与服务器转换分析会少。

如果该表索引,批量插入(加载数据或多行插入语句)可以用来减少索引的开销。这可以减少索引更新的影响,因为索引只需要刷新只有当所有行是过时的,而不是在每一行进行处理。

如果需要将大量数据加载到新表中,则应创建表并在未编入索引时加载它,然后在创建索引之前加载数据,这将更快。一次创建索引(而不是每行索引)。

如果在加载之前删除或禁用索引,那么在加载数据和重新创建或启用索引之后,可能会使加载速度更快。如果要删除或禁用数据加载策略,您必须做一些实验,看看是否值得这样做。如果将少量数据加载到大型表中,重建和索引所需的时间将比加载数据要长。

索引的删除和创建索引来删除并重建索引。另一种方法是使用myisamchk或isamchk禁用和启用索引。这需要在MySQL服务器主机上有一个帐户,有一个写文件表的权利。禁用表的索引,你可以进入相应的数据库目录和执行下列命令之一:

与the.myi扩展索引文件的MyISAM表使用myisamchk使用isamchk与the.ism扩展索引文件的ISAM表。在数据加载到表,索引是激活如下:

如果您决定使用索引和表修复,应禁用激活,请介绍使用锁协议的第十三章来防止和更改锁服务器(虽然不是要修复的表,但同一表的修复过程,如它被修改,因此需要使用相同的锁协议)。

以上数据加载原则也适用于那些需要执行不同的操作客户相关的固定查询。例如,它通常是可取的避免运行选择在频繁更新的表很长时间查询。长时间运行选择查询可以产生很多冲突和减少作者的表现。一个可能的解决方案是存储记录在临时表中插入操作如果主要是书面的,然后把这些定期记录主表。如果你需要访问新的立即记录,这是不是一个可行的方法,但这种方法可以用于只要不在短时间内访问它们。有使用临时表的优势两方面。首先,它减少了s与主表上SELECT语句语句的争用,因此执行速度更快。第二,从临时表到主表加载记录的总时间小于总负载记录。相应的索引缓存只需要在每个批处理加载结束时刷新,而不是在加载完每一行之后,这个策略的应用是访问Web服务器的Web页面访问MySQL数据库,在这种情况下,不能保证更高权限立即进入主表。

如果数据是完全在非正常事件关闭单个记录到系统中,然后减少的另一个策略指数刷新使用MyISAM表创建选项delayed_key_write(如果MySQL用于某些数据录入工作时可能会出现这种情况),这个选项允许索引缓存刷新只是偶尔的,而不是在每次插入。

如果你想使用延迟指数在服务器范围的刷新,只是与延迟的关键写选项启动mysqld。在这种情况下,索引块的写操作被延迟,直到刷新块使其他指标值的房间,或推迟到一个flush-tables命令后,或延迟索引表。