Nếu bạn phải sử dụng regexp-style WHERE
, bạn chắc chắn sẽ bị cản trở bởi các vấn đề truy vấn chậm. Để tìm kiếm kiểu regexp hoạt động, MySQL phải so sánh mọi giá trị trong cột tên của bạn với regexp. Và, truy vấn của bạn đã làm tăng gấp đôi rắc rối bằng cách xem thêm cột tên người dùng của bạn.
Điều này có nghĩa là MySQL không thể tận dụng bất kỳ chỉ mục nào, đó là cách tất cả các DBMS tăng tốc truy vấn của các bảng lớn.
Có một số điều bạn có thể thử. Tất cả chúng đều liên quan đến việc nói lời tạm biệt với REGEXP.
Một là cái này:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
Nếu bạn tạo chỉ mục trên các cột tên và tên người dùng của mình, điều này sẽ rất nhanh. Nó sẽ tìm kiếm tất cả các tên / tên người dùng bắt đầu bằng 'jack'. LƯU Ý rằng
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
sẽ tìm kiếm các tên kết thúc bằng 'jack' nhưng sẽ chậm như tìm kiếm kiểu regexp của bạn.
Một điều khác bạn có thể làm là tìm ra lý do tại sao ứng dụng của bạn cần có khả năng tìm kiếm một phần của tên hoặc tên người dùng. Bạn có thể loại bỏ tính năng này khỏi ứng dụng của mình hoặc tìm ra một số cách tốt hơn để xử lý nó.
Những cách tốt hơn có thể có:
- Yêu cầu người dùng của bạn chia nhỏ tên của họ thành các trường tên cụ thể và họ, đồng thời tìm kiếm riêng.
- Tạo một tính năng "tìm kiếm tất cả người dùng" riêng biệt chỉ được sử dụng khi người dùng cần, do đó giảm tần suất truy vấn kiểu regexp chậm của bạn.
- Tự tách tên của chúng thành một bảng tên-từ riêng biệt bằng cách sử dụng một số loại quy trình xử lý trước. Tìm kiếm bảng tên-từ mà không cần regexp.
- Tìm ra cách sử dụng tìm kiếm toàn văn MySQL cho tính năng này.
Tất cả những điều này liên quan đến một số công việc lập trình.