Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql interroge la même avec une seconde d'index sans obtenir 10000xFetch time ?

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

a 3 problèmes de performances :

  • OR est mal optimisé. Essentiellement, la table doit être analysée pour vérifier toutes les lignes. Il est peu probable que les index soient utiles.
  • UPPER(indexed-column) empêche l'utilisation d'un index sur cette colonne. Ceci est facilement contourné en déclarant que cette colonne a un COLLATION c'est "insensible à la casse" -- c'est-à-dire quelque chose comme utf8_unicode_ci; notez le _ci .
  • LIKE '%... impossible d'utiliser un index à cause du leading caractère générique.

De plus, il est généralement insensé d'avoir

32497 row(s) returned

Qu'allez-vous faire avec autant de lignes ? Le temps de transfert réseau sera important, même si la requête elle-même ne l'est pas.

Pour "résoudre" le LIKE , OR , et UPPER tous les problèmes à la fois, rassemblez le texte dans une seule colonne d'un seul tableau. Ensuite, fournissez un FULLTEXT index sur cette colonne. Le, MATCH ... AGAINST ... fonctionnera beaucoup plus rapidement - au moins pour faire le SomeName chercher. (Les LEFT JOINs sont une autre affaire.)