Diamo un'occhiata a una parte di questo.
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']."%");
});
}
Questo schema di corrispondenza delle parole chiave è intrinsecamente e disastrosamente lento. È lento sia in Eloquent che in SQL nativo. Non può funzionare in MySQL senza eseguire un scansione completa della tabella . Cioè, deve esaminare ogni riga della tabella alla ricerca di corrispondenze e non può, in MySQL, sfruttare nessuno schema di ricerca indicizzato. Perché?
column LIKE 'constant%'
può guardare un indice su column
e trova rapidamente qualsiasi valore che inizi con 'constant'
. Ma
column LIKE '%constant%'
deve guardare ogni valore nella tabella. Il %
iniziale rende inutile la ricerca nell'indice.
In MySQL sarebbe saggio indagare sulla ricerca FULLTEXT di MySQL come un modo per gestire la ricerca delle parole chiave. (Le versioni recenti di postgreSQL possono gestire questo tipo di query direttamente con un diverso tipo di indice, ma non MySQL.)