2012-01-16 55 views
5

爲什麼或如何解決mysql上的問題。MySQL SELECT非常慢,因爲LONGBLOB

table xxx 
-> id primary key 
-> name varchar 255 
-> data longblob 

當我保存這個表100文件,每個100MB,則該表將具有10GB

,然後儘量選擇任何行......這需要長期

SELECT name FROM xxx WHERE id = 50 LIMIT 1; 

需要大約8秒

我的問題可能在於,mysql在讀取整行之前,它返回name,它只有255個字符...所以當我想列出100個文件名時,m ysql讀取10 GB並返回約2 KB的結果。

+0

StackExchange會在您編寫問題/答案時顯示預覽。請看預覽並確保格式正確。如果您所編寫的預先格式化的代碼在預覽中顯示爲單行,那麼它就會看起來像其他人一樣。因此,使用「代碼示例」按鈕進行正確格式化(或者在每行之前放4個空格,SE將知道它是預格式化的代碼)。 – 2012-01-16 12:56:31

回答

6

試着將blob分割成單獨的表格。

例如,你可以有包含列idname,以及包含列iddata另一個表xxx_dataxxx。如果您只需要名稱,則根本不需要查詢xxx_data表;如果你需要的名稱和數據,你可以加入表一起使用共享主鍵id

SELECT id, name, data 
FROM xxx JOIN xxx_data USING (id) 
WHERE id = ... 

欲瞭解更多信息和優化的思路,例如見10 tips for optimizing MySQL queries

+2

我只是在此基礎上添加的,你應該考慮將這些文件存儲在文件系統而不是數據庫中。當然,有理由將它們存儲在數據庫中(比如安全,易於刪除,在許多服務器上輕鬆複製等),但想象你想要返回10個文件...你查詢數據庫,然後存儲10 * 100MB RAM。你真的想在你的服務器上消耗1GB的RAM來恢復文件,而你可以從服務器上的某個位置流式傳輸它們嗎?我認爲你的文件太大而不能存儲在數據庫中。 – 2012-01-16 17:32:18

+1

如果您不是絕對需要數據庫中的數據,也可以將其移至文件系統。我認爲在處理大量文件或大文件時效果更好。 – 2012-01-16 17:32:22