Hãy xem một phần của điều này.
if(!empty($filter['keyword'])) {
$leads=$leads->where(function ($q) use ($filter) {
$q->where('ld_name','like', "%".$filter['keyword']."%")
->orWhere('ld_email','like', "%".$filter['keyword']."%")
->orWhere('ld_phoneno','like', "%".$filter['keyword']."%");
});
}
Lược đồ đối sánh từ khóa này vốn dĩ rất chậm và tai hại. Nó chậm trong cả Eloquent và SQL gốc. Không có cách nào nó có thể hoạt động trong MySQL mà không thực hiện quét toàn bộ bảng . Đó là, nó phải kiểm tra mọi hàng trong bảng của bạn để tìm kiếm các kết quả phù hợp và không thể, trong MySQL, khai thác bất kỳ lược đồ tra cứu được lập chỉ mục nào. Tại sao?
column LIKE 'constant%'
có thể xem chỉ mục trên cột column
và nhanh chóng tìm thấy bất kỳ giá trị nào bắt đầu bằng 'constant'
. Nhưng
column LIKE '%constant%'
phải xem xét mọi giá trị trong bảng. %
hàng đầu làm cho việc tra cứu chỉ mục trở nên vô ích.
Trong MySQL, bạn sẽ khôn ngoan khi điều tra tìm kiếm FULLTEXT của MySQL như một cách xử lý tra cứu từ khóa của bạn. (Các phiên bản postgreSQL gần đây có thể xử lý loại truy vấn này trực tiếp với một loại chỉ mục khác, nhưng không phải MySQL.)