Mysql
 sql >> Datenbank >  >> RDS >> Mysql

können wir eloquent in einer großen Anzahl von Aufzeichnungen vermeiden

Werfen wir einen Blick auf einen Teil davon.

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']."%");
       });
 }

Dieses Keyword-Matching-Schema ist von Natur aus und katastrophal langsam. Es ist sowohl in Eloquent als auch in nativem SQL langsam. Es gibt keine Möglichkeit, dass es in MySQL funktioniert, ohne einen auszuführen vollständiger Tabellenscan . Das heißt, es muss jede Zeile Ihrer Tabelle auf Übereinstimmungen untersuchen und kann in MySQL kein indiziertes Suchschema ausnutzen. Warum?

column LIKE 'constant%'

kann einen Index auf column betrachten und finden Sie schnell jeden Wert, der mit 'constant' beginnt . Aber

column LIKE '%constant%'

muss sich jeden Wert in der Tabelle ansehen. Das führende % macht die Indexsuche nutzlos.

In MySQL wäre es ratsam, die MySQL-Volltextsuche als Möglichkeit, Ihre Keyword-Suche zu handhaben. (Neuere Versionen von postgreSQL können diese Art von Abfrage direkt mit einer anderen Art von Index verarbeiten, aber nicht mit MySQL.)