Cách thiết kế bảng trong mysql để truy vấn nhanh

em có 1 bảng khoảng 1 triệu dòng.
category varchar
service_id INT
object_id TEXT

khi em select với WHERE category = ‘XXX’ AND service_id = YYY AND object_id = ‘ZZZ’ thì rất chậm, phải 5 6s mới ra, dù kết quả chỉ có 2,3 dòng

em đã đánh index riêng lẻ cho cả 3. em nghe nói có cái đánh index gộp kiểu nhiều column cùng 1 kiểu dữ liệu vào 1 index, nhưng 3 column kia là 3 kiểu dữ liệu khác nhau.

và 1 cái nữa là khi select WHERE IN rất nhanh nhưng WHERE LIKE thì lại rất chậm.

không biết có cách nào để tối ưu hơn không nhỉ. em cảm ơn

image

Theo mình biết thì “where like” thì nó sẽ quét toàn bộ table từ a tới z luôn, nên hiển nhiên là nó sẽ chậm.

Lên google tìm thử thì thấy 1001 cách, tuỳ vô từng trường hợp cụ thể

(Có thể hơi lạc đề chút, nhưng bạn có thể tìm thêm keywork “mysql live search”, hoăc “real time search”, nhiều khi sẽ có thêm ý tưởng)

Bạn đọc thử article này:

MÌnh không giỏi vụ query nên chỉ biết vậy thôi, nhưng mình từng có nhu cầu search tương tự và mình giải quyết bằng elastic search và kết quả rất hài lòng.

Mình biết là làm như vậy là kiểu giết gà bằng dao mổ trâu, nhưng nếu bạn không ngại tốn công ngồi tìm hiểu thêm, thì thử elastich search hoac những alternative của nó cũng được

TEXT sẽ bị lưu ở ngoài bảng nên rất chậm và không join được, còn VARCHAR lưu trong bảng. LIKE '%' không sử dụng được index.

Ngoài ra TEXT còn bị hạn chế nặng nề vì nó cũ.

1 Like

vâng a để e tìm hiểu xem. em trước giờ cũng chỉ biết mysql cơ bản. thiết kế table để nó lưu dữ liệu đc là dc. giờ xử lý khi có nhiều dữ liệu mới thấy rất chậm, cần phải tối ưu nhiều thứ từ kiểu dữ liệu, index… chứ không phải chỉ lưu được dữ liệu vào là xong đúng ko a.

ngoài với trong bảng là ntn nhỉ anh? BLOBTEXT, LONGTEXT… nó có nặng nề như TEXT ko a? ví dụ dữ liệu quá tài k thể lưu varchar đc thì nên chọn cái gì nhỉ

bạn có tể cải thiện bằng cách sử dụng full-text search. hầu hết các RDBMS phổ biến hiện nay đều có hỗ trợ full-text search.
trong mysql có hỗ trợ full-text search từ version 5.7
bạn có thể sử dụng FULLTEXT index để có thể cải thiện perf. tất nhiên cái giá phải trả là sẽ tốn bộ nhớ hơn cho việc index.
https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?