2011-12-09 44 views
0

我有一個非常大的數據庫(每天都會添加新信息),建立了一個用於在線搜索數據庫的cakePHP應用程序。因爲它太大了又慢,我想在一個新的數據庫階段的數據:將數據附加到分段數據庫的MYSQL腳本(附帶條件)

- only the last 12 months 
- converts the serial varchar field data into INT (for sorting and "in btw" searches) 
- Only take numeric serials less than 5 numbers (< 99999) 

舊數據庫

id(key)   serial (varchar) Date(datetime)           
--------   ----------- -------------- 
1     12345    2011-02-15 23:50:26 
2     12345678   2008-12-15 23:50:26 
3     abc45    2009-12-15 23:50:26 

新的數據庫

id(key)   serial (INT) Date(datetime)     
--------   ----------- -------------- 
1     12345   2011-02-15 23:50:26 

。 我需要一個MYSQL腳本,我可以計劃每天運行並將新條目(具有上述條件)添加到新數據庫中,並將此數據庫用於CakePHP應用程序

回答

1

您可以執行每日腳本,首先運行初始導入後:

第一個劇本,進口12個月數據:

INSERT INTO new_database.table_name (serial, date) 
SELECT old.serial, old.date 
FROM old_database.table_name old 
WHERE old.date > DATE_SUB(CURDATE(), INTERVAL 1 YEAR) 
AND LENGTH(old.serial) < 6; 

每日劇本,只是進口在過去24小時:

INSERT INTO new_database.table_name (serial, date) 
SELECT old.serial, old.date 
FROM old_database.table_name old 
WHERE old.date > DATE_SUB(CURDATE(), INTERVAL 24 HOUR) 
AND LENGTH(old.serial) < 6; 

我將您的序列號長度標準解釋爲5個字符或更少(< 6),因爲您的示例有5位數字。

如果日常腳本沒有準確運行,爲避免跳過或重複,您可能需要編輯腳本。例如,如果序列號是唯一的,則可以通過選擇僅在新數據庫表中不存在的序列號來避免插入重複記錄。

+0

我是否需要爲varchar serial字段進行某種類型的轉換,因爲它將成爲新數據庫中的INT? –

+0

MySQL應該爲您即時轉換,但您可以執行以下操作:'SELECT CONVERT(old.serial,UNSIGNED),old.date' – JYelton

0

因此,您需要一個CakePHP可以處理的新表。這可以通過triggers來保持,所以對大表和慢表的任何改變也正在改變小而快的表。

然後你需要刪除舊的條目(你只需要擔心舊條目,那些壞串行永遠不會被添加)。您可以將其作爲任何觸發器的捎帶或作爲每晚運行的獨立腳本來完成。更漂亮的是將其作爲mysql內部事件來完成。

+0

對不起安德烈亞斯我不熟悉觸發器或其他先進的MySQL能力。我只是想用UPDATE mysql腳本來做到這一點 –

+0

對。這當然是可能的。你將無法搜索最新的信息,但如果沒有問題,那麼使用@JYelton這樣的簡單腳本就可以實現,這很好。你可能想要分幾次進行,限制時間不要太長。 –