MySQL高效载入数据到MyISAM表的方法

来源:互联网 发布:java线程教程 编辑:程序博客网 时间:2024/05/21 06:24

需求:
数据载入表的过程中,表中的索引要对载入的每行记录检查,导致载入操作会很慢。所以需要使用一些技巧来提速。

方法一:
禁用索引->载入数据->重新启用索引

alter table t disable keys;load data infile '/var/lib/mysql-files/t.txt' into table t;alter table t enable keys;

优缺点分析:
这种方法将构建索引放在数据完全载入表中之后,避免了数据载入过程中的检查,加快了数据载入。并且,这个时候构建索引可以通过排序来构建更加紧凑的索引树。
但是这种方法对唯一索引没有效果,因为disable keys只对非唯一索引有效。
方法二:
1. 使用需要的表结构创建一张表t_new,不包含索引
2. 载入数据到表t_new
3. 使用需要的表结构创建一张表t_new_2 ,包含索引
4. 执行flush tables with read lock;加读锁且刷新
5. 重命名t_new_2表的.frm和.MYI为t_new.frm和t_new.MYI
6. 释放读锁(unlock tables)
7. 使用repair table来修复表
实际操作:
步骤 1、2:
这里写图片描述
步骤 3:
这里写图片描述
步骤4 、6 、7:
这里写图片描述
步骤 5:
这里写图片描述

最后要记得在/var/lib/mysql/db_name下手动删除t_new_2.MYD文件,原因见下图:

这里写图片描述

其中,我在看书的时候有两个疑问,一个是repair table到底做了什么,当时在上课,也没有去实践,百思不得其解。晚上到图书馆走了一遍流程问题迎刃而解了:在执行repair table 时下面提示Number of rows changed From 0 to 300024,而在repair之前执行记录统计结果为0,也就是就本例来说,repair把数据恢复了。另一个是关于第3步改文件名的问题,我疑问,改了之后两个.frm和两个.MYI计算机怎么处理。晚上敲了一下问题也解决了,mv命令会覆盖本目录已存在的t_new.frm和t_new.MYI。现在看来这个问题是由于自己对Linux命令mv的不了解造成的。实践很重要!

0 0