Laten we eens kijken naar een deel hiervan.
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']."%");
});
}
Dit schema voor het matchen van zoekwoorden is inherent, en rampzalig, traag. Het is traag in zowel Eloquent als native SQL. Het kan onmogelijk werken in MySQL zonder een volledige tafel scan . Dat wil zeggen, het moet elke rij van uw tabel onderzoeken op zoek naar overeenkomsten en kan in MySQL geen geïndexeerd opzoekschema misbruiken. Waarom?
column LIKE 'constant%'
kan een index bekijken op column
en vind snel een waarde die begint met 'constant'
. Maar
column LIKE '%constant%'
moet naar elke waarde in de tabel kijken. De toonaangevende %
maakt het opzoeken van de index nutteloos.
In MySQL is het verstandig om MySQL's FULLTEXT zoeken als een manier om uw zoekwoordzoekactie af te handelen. (Recente versies van postgreSQL kunnen dit soort zoekopdrachten rechtstreeks afhandelen met een ander soort index, maar niet met MySQL.)