Yêu cầu thg 6 7, 2018 2:40 SA 772 0 2
  • 772 0 2
0

Đánh index để tăng performance khi search like trong Laravel

Chia sẻ
  • 772 0 2

Hiện tại project mình làm có bảng posts gồm các fields như title, content... Chức năng search post thì mình where like theo field title. Mọi người cho mình hỏi là với trường hợp như vậy thì mình có thể đánh index cho field title để search nhanh hơn không nhỉ, mong nhận được suggest của mọi người, cảm ơn

2 CÂU TRẢ LỜI


Đã trả lời thg 6 7, 2018 2:48 SA
+1

Theo mình biết thì đánh index chỉ nhanh hơn khi bạn sử dụng câu truy vấn Select, còn nếu thường xuyên sử dụng Insert hay Update thì tốc độ sẽ bị chậm đi. Bạn có thể xem thêm trong bài viết này: https://viblo.asia/p/chi-muc-index-trong-mysql-MJykjQXZePB , phần lưu ý khi sử dụng chỉ mục vì mình nghĩ với bảng posts thì insert, update sẽ nhiều hơn đấy

Chia sẻ
Đã trả lời thg 6 7, 2018 3:03 SA
+1

Theo mình biết thì với câu truy vấn like, index chỉ có hiệu quả khi target không bắt đầu bằng % 🤔

Tức với câu truy vấn LIKE 'text' hoặc LIKE 'text%' thì sẽ nhanh hơn thông qua việc đánh index, còn LIKE '%text' thì sẽ không có hiệu quả.

Ở trường hợp của bạn thì khó mà chỉ sử dụng LIKE 'text%' không thôi được, mà cần dùng LIKE '%text%' để search nên chắc là không ổn lắm 😂

Một giải pháp khác là bạn nên dùng Full Text Search thay vì câu truy vấn LIKE. Vừa cho ra kết quả nhanh, vừa chính xác hơn 😄

Chia sẻ
Avatar Thanh @Huu
thg 6 8, 2018 7:10 SA

Vì chức năng search của mình cần join nhiều bảng, xữ lý tính toán trong câu query nữa, nếu như thế thì có dùng Easticsearch được không bạn nhỉ. Nếu dữ liệu mình có là "Have technical problems? Ask on Viblo" Thì gõ "tech" thì nó không trả về kết quả nhỉ, vì nó là full-text mà, nếu dùng wildcard trong elasticsearch thì nó trả về kết quả, nếu như thế thì có khác gì search like đâu bạn nhỉ

Avatar Tran Duc Thang @thangtd90
thg 6 8, 2018 8:17 SA

@Huu

Vì chức năng search của mình cần join nhiều bảng, xữ lý tính toán trong câu query nữa, nếu như thế thì có dùng Easticsearch được không bạn nhỉ.

Bạn có thể search từ Elasticsearch ra, sau đó lấy kết quả rồi select và join với các bảng khác trong MySQL mà 😄

Nếu dữ liệu mình có là "Have technical problems? Ask on Viblo" Thì gõ "tech" thì nó không trả về kết quả nhỉ, vì nó là full-text mà, nếu dùng wildcard trong elasticsearch thì nó trả về kết quả, nếu như thế thì có khác gì search like đâu bạn nhỉ

Có lẽ bạn hiểu sai khái niệm về full text search rồi 😃 Full text search làm được nhiều việc hơn rất nhiều so với phép LIKE thông thường của SQL. Ví dụ như ở câu của bạn "Have technical problems? Ask on Viblo" thì nếu bạn search "have problems", "has problems", "ask in Viblo", hay thậm chí "probelms" (viết sai chính tả) nó vẫn có thể trả ra kết quả được cho bạn (bạn cứ thử với chức năng search của Viblo thì sẽ rõ 😄), chứ phép toán LIKE thì chịu chết 😂 Chưa kể phép toán like sẽ rất là chậm nữa (do hầu như không tận dụng được index)

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí