我已經在MySQL中編寫了一個存儲過程,以便當前在表中取值並「歸一化」它們。這意味着對於傳遞給存儲過程的每個值,它會檢查該值是否已經在表中。如果是,那麼它將該行的id存儲在一個變量中。如果該值不在表中,則它存儲新插入的值的ID。然後存儲過程採用這個id並將它們插入一個相當於原來的非規範化表的表中,但這個表完全標準化並且主要由外鍵組成。MySQL規範化存儲過程性能
這個設計的問題在於存儲過程需要大約10ms左右才能返回,當您試圖通過一些1000萬條記錄時,這太長了。我的懷疑是,表演與我在做插入的方式有關。即
INSERT INTO TableA
(first_value)
VALUES
(argument_from_sp) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
SET @TableAId = LAST_INSERT_ID();
的「對重複密鑰更新」是一個黑客位的,因爲事實上,關於重複的鍵,我不想進行任何更新而只是返回值的行的ID。如果您錯過了這一步,LAST_INSERT_ID()函數會在您嘗試運行「SET ...」語句時返回錯誤的值。
有誰知道更好的方法來做到這一點在MySQL?
唯一標識符否則會是VARCHAR字段。由於性能原因,我寧願使用整數字段。 – srkiNZ84 2010-07-25 23:15:23
唯一標識符仍然是一個varchar字段;你所做的一切就是在表格中添加另一列和另一個唯一的索引。整數唯一標識符沒有任何用處,可以說最好的是它不會讓事情變得非常緩慢。 對應用程序的所有部分進行基準測試是一個不錯的主意,可以讓您專注於重要的事情。 – 2010-07-26 08:13:51