sql >> Base de Datos >  >> RDS >> Mysql

¿Podemos evitar ser elocuente en un gran número de registros?

Echemos un vistazo a una parte de esto.

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

Este esquema de concordancia de palabras clave es intrínsecamente y desastrosamente lento. Es lento tanto en Eloquent como en SQL nativo. No hay forma de que funcione en MySQL sin hacer un exploración completa de la tabla . Es decir, debe examinar cada fila de su tabla en busca de coincidencias y no puede, en MySQL, explotar ningún esquema de búsqueda indexado. ¿Por qué?

column LIKE 'constant%'

puede mirar un índice en column y encuentre rápidamente cualquier valor que comience con 'constant' . Pero

column LIKE '%constant%'

tiene que mirar cada valor en la tabla. El % principal hace que la búsqueda en el índice sea inútil.

En MySQL sería prudente investigar Búsqueda de TEXTO COMPLETO de MySQL como una forma de manejar la búsqueda de palabras clave. (Las versiones recientes de postgreSQL pueden manejar este tipo de consulta directamente con un tipo diferente de índice, pero no con MySQL).