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

8 nhận xét:

  1. 1 tỉ thì hơi nhiều cho mysql rồi :D .
    BTW . Trong trường hợp này bạn nên sử dụng "mysql partitioning"
    http://www.thomaskeller.biz/blog/2010/08/04/mysql-partitioning/
    Tất nhiên là nếu bạn vẫn muốn bám lấy mysql .

    Trả lờiXóa
  2. Cám ơn bác, em đang xài MySQL và tất nhiên là thấy ... không ổn lắm. Cũng đang nghiên cứu các giải pháp partition, merge table, replication và cũng đang thử xem Percona nó như thế nào.

    Có ai có kinh nghiệm với Percona không ạ.

    Trả lờiXóa
  3. Chào bạn Phong, mình xin giải đáp những thắc mắc của bạn:

    1. Blogs này của cộng đồng, mục đích là để chia sẻ những cái hay trong công việc của mỗi người. "Điều kiện ràng buộc" như bạn muốn biết thì ko có j` đâu.

    2. Form liên hệ cũng là 1 thiếu sốt của cả nhóm, cám ơn bạn :D

    3. Reply sớm nhất sau 2 ngày (t7,cn chắc ko ai on) :D)

    Note: mình cũng ko biết liên hệ lại với bạn ntn để gửi bạn tài khoản, đành lại phải cm vào đây. Mong bạn đóng góp được nhiều bài viết bổ ích \m/ (đổi pass ngày nhé)

    Login: http://i-php.net/wp-admin
    Acc : thaiphong
    pass : *******
    // đã send qua email .

    Trả lờiXóa
  4. Hi, mừng mem mới :D

    Có một hạn chế là khi có một vấn đề cần thảo luận thôi. Chẳng lẽ lại viết một bài ra rất là lãng. Vì vậy nếu có một mailing list để tham khảo trước khí post bài cũng tốt.

    Trả lờiXóa
  5. Trần Ngọc Nhật17:05 8 tháng 9, 2011

    Mình cũng thích phần tối ưu hóa các bài toán NP, đưa các hàm có O(n) về nhỏ nhất qua bài viết này mình cũng được có thêm một kiến thức về dữ liệu.
    Cám ơn các bạn đã chia sẻ
    Mình xin chia sẻ một số kiến thức nhỏ bé của mình về vấn đề này như sau:
    CSDL phải đạt 3NF trở lên
    Nếu có FD đa trị thì phải phân tích FD đa trị thành các FD đạt 3NF trở lên
    Khi đó các bạn sẽ không bị vấn đề so sánh dữ liệu NP và tốc độ truy xuất sẽ nhanh hơn
    Thứ 2 các đoạn mã PHP nên tôi ưu sao cho O(n) <= 4 để có thể tránh được độ phúc tạp trong quá trình thực thi mình nói hơi lý thuyết mong các bạn đừng trách mình nha

    Trả lờiXóa
  6. :) Đúng là tính lý thuyết hơi cao. Nếu bạn rảnh rảnh quay lại blog này thì bạn giải thích rõ hơn các khái niệm FD, NF nha.

    Trả lờiXóa
  7. Trần Ngọc Nhật18:58 9 tháng 2, 2012

    FD : Functional dependency (Phụ thuộc hàm)
    NF : Normal Form (Dạng chuẩn)
    Đây là hai khái niện trong cơ sở dữ liệu các bạn có thể đọc trong các cuốn sách về cở sở dữ liệu

    Trả lờiXóa