Tôi cần lưu trữ tiềm năng 100 trong số hàng triệu URL trong cơ sở dữ liệu. Mỗi URL phải là duy nhất, do đó tôi sẽ sử dụng ON UPPLINGING DUPLICATE KEY và đếm các URL trùng lặp.Cách lưu trữ URL trong MySQL
Tuy nhiên, tôi không thể tạo chỉ mục trên trường URL vì trường varchar của tôi là 400 ký tự. MySQL đang phàn nàn và nói; "# 1071 - Khóa được chỉ định quá dài; chiều dài khóa tối đa là 767 byte". (Varchar 400 sẽ mất 1200 byte)
Cách tốt nhất để làm điều này là gì, nếu bạn cần xử lý tối thiểu 500.000 URL mỗi ngày trong một máy chủ đơn lẻ?
Chúng tôi đã suy nghĩ bằng cách sử dụng MongoDB cho cùng một ứng dụng, vì vậy chúng tôi chỉ có thể truy vấn MongoDB và tìm URL trùng lặp và cập nhật hàng. Tuy nhiên, tôi không ủng hộ việc giải quyết vấn đề này bằng MongoDB và tôi chỉ muốn sử dụng MySQL ở giai đoạn này vì tôi muốn càng gọn gàng càng tốt trong phần đầu và hoàn thành phần này của dự án nhanh hơn nhiều. (Chúng tôi chưa chơi với MongoDB và không muốn dành thời gian ở giai đoạn này)
Có khả năng nào khác làm điều này bằng cách sử dụng ít tài nguyên và thời gian hơn không. Tôi đã suy nghĩ để có được MD5 băm của URL và lưu trữ nó là tốt. Và tôi có thể biến trường UNIQUE thành thay thế. Tôi biết, sẽ có va chạm nhưng nó là ok để có 5-10-20 bản sao trong 100 triệu URL, nếu đó là vấn đề duy nhất.
Bạn có bất cứ đề xuất nào không? Tôi cũng không muốn dành 10 giây để chèn chỉ một URL, vì nó sẽ xử lý 500 nghìn URL mỗi ngày.
Bạn sẽ đề xuất điều gì?
Chỉnh sửa: Theo yêu cầu, đây là định nghĩa bảng. (Hiện tại tôi không sử dụng MD5, đó là để thử nghiệm)
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)
Không có khả năng nhận được 5 xung đột trong 100.000.000 URL cho rằng có 3,4 * 10^38 băm MD5 có thể có ... Và có nhiều băm lớn hơn ở đó. –
Vâng, đúng vậy. Tôi đã không tính toán nó thực sự. – merinn
Vui lòng đăng định nghĩa bảng – Bohemian