我需要在數據庫中存儲潛在的數百萬個URL。每個URL都應該是唯一的,因此我將使用ON DUPLICATE KEY UPDATE並計算重複的URL。如何在MySQL中存儲URL
但是,我無法在URL字段上創建索引,因爲我的varchar字段爲400個字符。 MySQL正在抱怨並說: 「#1071 - 指定的密鑰太長,最大密鑰長度是767字節」。 (Varchar 400需要1200個字節)
如果您需要在單臺服務器上每天處理最少500000個URL,那麼最佳方法是什麼?
我們已經在考慮對同一個應用程序使用MongoDB,所以我們可以簡單地查詢MongoDB並找到重複的URL並更新該行。但是,我不贊成使用MongoDB來解決這個問題,而且我希望在這個階段只使用MySQL,因爲我希望在開始時儘可能精簡,並且可以更快地完成項目的這一部分。 (我們還沒有玩過MongoDB,不想花時間在這個階段)
是否有任何其他的可能性使用較少的資源和時間來做到這一點。我正在考慮獲取URL的MD5哈希值並存儲它。而我可以將該字段改爲UNIQUE。我知道,會有衝突,但如果這是唯一的問題,則可以在1億個網址中添加5-10-20個重複項。
你有什麼建議嗎?我也不想花費10秒來插入一個URL,因爲它每天處理500k個URL。
你會建議什麼?
編輯:根據請求,這是表定義。 (我不是在此刻使用MD5,它是用於測試)
mysql> DESC url;
+-------------+-----------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------+------+-----+-------------------+-----------------------------+
| url_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| url_text | varchar(400) | NO | | | |
| md5 | varchar(32) | NO | UNI | | |
| insert_date | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| count | mediumint(9) unsigned | NO | | 0 | |
+-------------+-----------------------+------+-----+-------------------+-----------------------------+
5 rows in set (0.00 sec)
考慮到有3.4 * 10^38個可能的MD5哈希值,它不太可能在100,000,000個URL中發生5次碰撞......並且存在更大的哈希值。 –
是的,沒錯。我實際上沒有計算它。 – merinn
請張貼表格定義 – Bohemian