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

Du point de vue des performances, dans quelle mesure est-il efficace d'utiliser une table temporaire MySQL pour une fonctionnalité de site Web très utilisée ?

Ce que vous avez indiqué est tout à fait correct, la table temporaire ne sera visible que pour l'utilisateur/la connexion actuelle. Néanmoins, il y a des frais généraux et d'autres problèmes tels que :

  • Pour chacune des milliers de recherches, vous allez créer et remplir ce tableau (et le supprimer plus tard) - et non par utilisateur, par recherche. Parce que chaque recherche ré-exécutera très probablement le script, et "par session" ne signifie pas session PHP - cela signifie session de base de données (connexion ouverte).
  • Vous aurez besoin du CREATE TEMPORARY TABLES privilège, que vous pourriez pas.
  • Néanmoins, cette table devrait vraiment avoir le type MEMORY, qui vole votre RAM plus qu'il n'y paraît. Parce que même avec VARCHAR, les tables MEMORY utilisent un stockage de lignes de longueur fixe.
  • Si votre heuristique doit plus tard faire référence à cette table deux fois (comme SELECT xyz FROM patternmatch AS pm1, patternmatch AS pm2 ... ) - cela n'est pas possible avec les tables MEMORY.

Ensuite, il serait plus facile pour vous - et aussi pour la base de données - d'ajouter le LIKE '%xyz%' directement sur vos images tableaux WHERE clause. Il fera la même chose sans la surcharge liée à la création d'une TABLE TEMP et à sa jonction.

Dans tous les cas - peu importe la direction que vous prendrez - ce WHERE sera horriblement lent. Même si vous ajoutez un index sur images.name vous aurez probablement besoin de LIKE '%xyz%' au lieu de LIKE 'xyz%' , afin que cet index ne soit pas utilisé.

Non. :)

Options alternatives

MySQL a une Fulltext-Search (depuis 5.6 également pour InnoDB) qui peut même vous donner ce score :je vous recommande fortement de le lire et de l'essayer. Vous pouvez être sûr que la base de données sait mieux que vous comment effectuer cette recherche efficacement.

Si vous envisagez d'utiliser MyISAM au lieu d'InnoDB, soyez conscient de la limitation souvent négligée selon laquelle les recherches FULLTEXT ne renvoient rien que si le nombre de résultats est inférieur à 50 % du nombre total de lignes de la table.

D'autres choses que vous voudrez peut-être regarder, sont par exemple Solr (une belle introduction lue sur ce sujet lui-même serait le début de http://en.wikipedia.org/wiki/Apache_Solr ). Nous l'utilisons dans notre entreprise et il fait un excellent travail, mais il nécessite un certain apprentissage.

Résumé

La solution à votre problème actuel lui-même (la recherche) consiste à utiliser les fonctionnalités FULLTEXT.

Pour vous donner un chiffre, 10 000 appels par seconde ne sont déjà pas "insignifiants" - avec des centaines de milliers de recherches par seconde, le type de problèmes de performances que vous rencontrerez est partout dans votre configuration. Vous allez avoir besoin de quelques serveurs, d'un équilibrage de charge et de tonnes d'autres trucs technologiques incroyables. Et l'un d'entre eux sera par exemple Solr;)