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

Mysql mismo consulta uno con índice segundo sin obtener 10000xFetch time?

OR UPPER(lu.opis) LIKE UPPER('%SomeName%')

tiene 3 problemas de rendimiento:

  • OR está mal optimizado. Esencialmente, la tabla debe escanearse para verificar todas las filas. Es poco probable que los índices ayuden.
  • UPPER(indexed-column) evita el uso de un índice en esa columna. Esto se soluciona fácilmente declarando que la columna tiene un COLLATION eso es "insensible a mayúsculas y minúsculas", es decir, algo como utf8_unicode_ci; tenga en cuenta el _ci .
  • LIKE '%... no puede usar un índice debido a la principal comodín.

Además, suele ser una tontería tener

32497 row(s) returned

¿Qué vas a hacer con tantas filas? El tiempo de transferencia de la red será significativo, incluso si la consulta en sí no lo es.

Para "resolver" el LIKE , OR y UPPER problemas todos a la vez, recopile el texto en una sola columna en una sola tabla. Luego proporcione un FULLTEXT índice en esa columna. El, MATCH ... AGAINST ... se ejecutará mucho más rápido, al menos para hacer SomeName búsqueda. (Los LEFT JOINs son otro asunto.)