Przyjrzyjmy się jednej części tego.
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']."%");
});
}
Ten schemat dopasowywania słów kluczowych jest z natury i katastrofalnie powolny. Jest powolny zarówno w Eloquent, jak i natywnym SQL. Nie ma możliwości, aby działał w MySQL bez wykonania pełny skan tabeli . Oznacza to, że musi sprawdzać każdy wiersz tabeli w poszukiwaniu dopasowań i nie może, w MySQL, wykorzystywać żadnego indeksowanego schematu wyszukiwania. Dlaczego?
column LIKE 'constant%'
może spojrzeć na indeks w column
i szybko znajdź dowolną wartość zaczynającą się od 'constant'
. Ale
column LIKE '%constant%'
musi spojrzeć na każdą wartość w tabeli. Wiodący %
sprawia, że wyszukiwanie indeksu jest bezużyteczne.
W MySQL dobrze byłoby zbadać wyszukiwanie FULLTEXT w MySQL jako sposób obsługi wyszukiwania słów kluczowych. (Najnowsze wersje postgreSQL mogą obsługiwać tego rodzaju zapytania bezpośrednio z innym rodzajem indeksu, ale nie MySQL.)