免费mysql数据库:提高MySQL中数据装载效率

相对来说将数据装入数据库是直截了当然而也存在可用来改善数据装载操作效率策略其基本原理如下:
成批装载较单行装载更快在装载每个记录后不需要刷新索引高速缓存Cache;可在成批记录装入后才刷新
在表无索引时装载比索引后装载更快如果有索引不仅必须增加记录到数据文件而且还要修改每个索引以反映增加了新记录
较短SQL 语句比较长SQL 语句要快它们涉及服务器方分析较少而且还将它们通过网络从客户机发送到服务器更快这些原因中有些似乎微不足道(特别是最后个原因)但如果要装载大量数据即使是很小原因也会产生很大区别结果我们可以利用上述般原理推导出几个有关如何最快地装载数据实际结论:
LOAD DATA(包括其所有形式)比INSERT 效率高其成批装载行索引刷新较少并且服务器只需分析和解释条语句而不是几条语句
LOAD DATA 比LOAD DATA LOCAL 效率更高利用LOAD DATA文件必须定位在服务器上而且必须具有FILE 权限但服务器可从磁盘直接读取文件利用LOAD DATA LOCAL客户机读取文件并将其通过网络发送给服务器这样做很慢
如果必须使用INSERT应该利用允许在单个语句中指定多行形式例如:
可在语句中指定行越多越好这样会减少所需语句数目降低索引刷新量如果使用mysqldump 生成数据库备份文件应该使用--extended-insert 选项使转储文件包含多行INSERT 语句还可以使用- - o p t(优化) 它启用--extended-insert 选项反的应该避免使用mysqldump --complete-insert 选项;此选项会导致INSERT 语句为单行执行时间更长比不用--complete-insert 选项生成语句需要更多分析
使用压缩了客户机/服务器协议以减少网络数据流量对于大多数MySQL客户机可以用--compress 命令行选项来指定般只用于较慢网络压缩需要占用大量处理器时间
让MySQL插入缺省值;不要在INSERT 语句中指定将以任意方式赋予缺省值平均来说这样做语句会更短能减少通过网络传送给服务器此外语句包含值较少服务器所进行分析和转换就会较少
如果表是索引则可利用批量插入( LOAD DATA 或多行INSERT 语句)来减少索引开销这样会最小化索引更新影响索引只需要在所有行处理过时才进行刷新而不是在每行处理后就刷新
如果需要将大量数据装入个新表应该创建该表且在未索引时装载装载数据后才创建索引这样做较快次创建索引(而不是每行修改次索引)较快
如果在装载的前删除或禁用索引装入数据后再重新创建或启用索引可能使装载更快如果想对数据装载使用删除或禁用策略定要做些实验看这样做是否值得(如果将少量数据装入个大表中重建和索引所花费时间可能比装载数据时间还要长)
可用DROP INDEX 和CREATE INDEX 来删除和重建索引种可供选择思路方法是利用myisamchk 或isamchk 禁用和启用索引这需要在MySQL服务器主机上有个帐户并对表文件有写入权为了禁用表索引可进入相应数据库目录执行下列命令的:
对具有.MYI 扩展名索引文件MyISAM 表使用myisamchk对具有.ISM 扩展名索引文件ISAM 表使用isamchk在向表中装入数据后按如下激活索引:
如果决定使用索引禁用和激活应该使用第13章中介绍表修复锁定协议以阻止服务器同时更改锁(虽然此时不对表进行修复但要对它像表修复过程样进行修改因此需要使用相同锁定协议)
上述数据装载原理也适用于和需要执行区别操作客户机有关固定查询例如般希望避免在频繁更新表上长时间运行SELECT 查询长时间运行SELECT 查询会产生大量争用并降低写入性能种可能解决思路方法为如果执行写入主要是INSERT 操作那么先将记录存入个临时表然后定期地将这些记录加入主表中如果需要立即访问新记录这不是个可行思路方法但只要能在个较短时间内不访问它们就可以使用这个思路方法使用临时表有两个方面好处首先它减少了和主表上SELECT 查询语句争用因此执行更快其次从临时表将记录装入主表总时间较分别装载记录总时间少;相应索引高速缓存Cache只需在每个批量装载结束时进行刷新而不是在每行装载后刷新这个策略个应用是进入Web 服务器Web 页访问MySQL数据库在此情形下可能没有保证记录立即进入主表较高权限
如果数据并不完全是那种在系统非正常关闭事件中插入单个记录那么减少索引刷新策略是使用MyISAM 表DELAYED_KEY_WRITE 表创建选项(如果将MySQL用于某些数据录入工作时可能会出现这种情况)此选项使索引高速缓存Cache只偶尔刷新而不是在每次插入后都要刷新
如果希望在服务器范围内利用延迟索引刷新只要利用--delayed-key-write 选项启动mysqld 即可在此情形下索引块写操作延迟到必须刷新块以便为其他索引值腾出空间为止或延迟到执行了个flush-tables 命令后或延迟到该索引表关闭
Tags:  免费mysql数据库

延伸阅读

最新评论

发表评论