從Access中提取若干信息,導入到mysql中。
嗯,多簡單的事呀。。。不過是SQL語句的導入導出嘛。。。我開始真的是這麼想的。。。
做的時候發現,Access沒有導出SQL的功能,不想用第三方的東西。。。
這裡簡單描述下我是怎麼做的吧!
1、在access中建個視圖,得到自己想要的數據;
2、把這個視圖查詢到的數據,導出成文本格式,我用的是CVS;
3、用文本編輯器,把導出的數據 處理成 SQL語句(多虧了vim,用其他編輯器都不知道怎麼辦才好,打開都成問題,更不用說快速編輯了。。。UE打開後,滾輪都滾不動的說。。。);
4、用mysql命令,導入mysql。
思路很清晰,我就這麼做了。直到最後一步,才發現問題:數據量太大(68萬條),這一步很慢很慢。
慢也就罷了,只做一次(等了我近2個小時),沒什麼關系。。。可是,馬上發現,數據中時間格式不對。比如Access中是2011-1-1,而mysql這邊,期望得到的是2011-01-01,就這一個時間,要改動幾十萬條記錄,還不如重新導一份新的呢。。。
於是,重復步驟2,得到數據。
因為導入過程慢的實在太離譜了,就找了個mysqldump 備份出來的文件來看,看一看mysql官方覺得怎樣導入數據會更快,於是發現了諸如下面的內容:
Sql代碼
LOCK TABLES `tablename` WRITE;
ALTER TABLE `tablename` DISABLE KEYS;
INSERT INTO `tablename` (id,name,password) VALUES
-- 這裡是數據
;
ALTER TABLE `tablename`ENABLE KEYS;
UNLOCK TABLES;
LOCK TABLES `tablename` WRITE;
ALTER TABLE `tablename` DISABLE KEYS;
INSERT INTO `tablename` (id,name,password) VALUES
-- 這裡是數據
;
ALTER TABLE `tablename`ENABLE KEYS;
UNLOCK TABLES;
很明顯,這裡的SQL從3個方面做了優化:
1、加了只寫的鎖(解鎖之前,不能查詢,同時索引 可以最後做,插入數據 就會快啦);
2、Disable了所有鍵(於是,就不用再做外鍵檢查了,全心插入數據);
3、insert into 用一條語句完成(一條語句 和 金條語句 的性能,差別不是一般的大啊,想想也覺得是。。。)。
這樣之後,幾分鐘就能搞定。
另外,說一點文本處理的。。。
一開始,習慣性的,要寫成一條一條的SQL,於是想到了用宏來做。宏很簡單,小數據量非常方便,不用大腦怎麼思考。但是,做了一會,發現實在太慢了,大數據量,處理不了。
我平時很少寫vim腳本,現在想來,用腳本也會很慢,畢竟要一行行的執行呀。。。
於是乎,寫正則,查找替換。很快,幾秒鐘搞定一次替換。正則的威力,真不是一般的強大啊。。。上面說的時間格式的轉換,也是在這裡做的。
注意:即使你的文本很好看,可以試試列編輯。一般行首適用,後面 幾乎都不可用了。。。
這裡要說的是,不要把多行數據變成一行,沒這個必要。變成一行後,可讀性會變的很差,文本處理會變的非常的慢。如果一行匹配的次數過多,用g這個參數,往往會很慢。。。
就說這些吧。。。
重新理了下思路。。。
下次估計10分鐘就能搞定這樣的事。。。