Thứ Sáu, 8 tháng 7, 2011

Giảm độ lớn của INDEX trong MySQL

Hi All,

Trong quá trình tìm giải pháp cho vấn đề của mình, bắt được một bài viết khá hay ở đây:

http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl

Đây là bài viết nói về cách làm giảm chiều dài của ID trên URL (giống như của YouTube).

Tuy cái này hay, nhưng chưa giúp mình trong việc giải quyết vấn đề sau đây.

Mình có một CSDL các sản phẩm (khoảng 1 tỉ). Khi INSERT một sản phẩm mới, mình muốn kiểm tra xem tên sản phẩm này có trong CSDL hay chưa.

Nếu sử dụng Zend Lucene hoặc MySQL Index thì dung lượng index khá là lớn. Vì vậy mình muốn HASH các tên sản phẩm vào một trường khác với chiều dài nhỏ hơn.

Khi so sánh tên sản phẩm thì sử dụng HASH CODE này.

Giải pháp của mình là sử dụng mã md5 raw, với chiều dài là 16 bytes. Với 1 tỉ records thì nó ngốn xấp xỉ 15 GB.

Mình chấp nhận khả năng trùng lặp ở một số trường hợp.

Tuy nhiên mình muốn giảm chiều dài của HASH CODE xuống nữa thì nên sử dụng biện pháp gì.  Mình chấp nhận khả năng bị trùng lặp nhiều hơn (tức là có 2 sản phẩm khác tên nhưng hashcode có thể vẫn giống nhau)?

Bởi vì mình nghĩ có 1 tỉ item, vẫn chỉ là INT(11) = 4 bytes, xài 16 bytes thì ... thấy hơi phí. Nếu có giải pháp giúp mình giảm xuống 8 bytes thì tốt nhất :D