Mysql
 sql >> Database >  >> RDS >> Mysql

Dal punto di vista delle prestazioni, quanto è efficiente utilizzare una tabella temporanea MySQL per una funzionalità di un sito Web molto utilizzata?

Quanto hai affermato è totalmente corretto, la tabella temporanea sarà visibile solo all'utente/connessione corrente. Tuttavia, ci sono alcune spese generali e altri problemi come:

  • Per ciascuna delle migliaia di ricerche che creerai e riempirai quella tabella (e la rilascerai in seguito) - non per utente, per ricerca. Perché ogni ricerca molto probabilmente eseguirà nuovamente lo script e "per sessione" non significa sessione PHP, significa sessione del database (connessione aperta).
  • Ti servirà il CREATE TEMPORARY TABLES privilegio, che potresti non avere.
  • Tuttavia, quella tabella dovrebbe davvero avere il tipo MEMORY, che ruba la tua RAM più di quanto sembri. Perché anche avendo VARCHAR, le tabelle MEMORY utilizzano l'archiviazione di righe a lunghezza fissa.
  • Se in seguito la tua euristica deve fare riferimento a quella tabella due volte (come SELECT xyz FROM patternmatch AS pm1, patternmatch AS pm2 ... ) - questo non è possibile con le tabelle MEMORY.

Successivamente, sarebbe più facile per te, e anche per il database, aggiungere il LIKE '%xyz%' direttamente alle tue images tabelle WHERE clausola. Farà lo stesso senza il sovraccarico di creare una TEMP TABLE e unirla.

In ogni caso - non importa da che parte tu vada - quel WHERE sarà terribilmente lento. Anche se aggiungi un indice su images.name molto probabilmente avrai bisogno di LIKE '%xyz%' invece di LIKE 'xyz%' , in modo che l'indice non venga utilizzato.

No. :)

Opzioni alternative

MySQL ha una Fulltext-Search (dal 5.6 anche per InnoDB) che può anche darti quel punteggio:consiglio vivamente di leggerlo e provarlo. Puoi essere certo che il database sa meglio di te come eseguire la ricerca in modo efficiente.

Se hai intenzione di utilizzare MyISAM invece di InnoDB, tieni presente la limitazione spesso trascurata che le ricerche FULLTEXT restituiscono solo qualcosa se il numero di risultati è inferiore al 50% delle righe totali della tabella.

Altre cose che potresti voler guardare, sono ad esempio Solr (una bella introduzione letta su quell'argomento stesso sarebbe l'inizio di http://en.wikipedia.org/wiki/Apache_Solr ). Lo stiamo usando nella nostra azienda e fa un ottimo lavoro, ma richiede un po' di apprendimento.

Riepilogo

La soluzione al tuo problema attuale (la ricerca) consiste nell'usare le funzionalità FULLTEXT.

Per darti un numero, 10.000 chiamate al secondo non sono già "banali" - con centinaia di migliaia di ricerche al secondo il tipo di problemi di prestazioni che incontrerai sono ovunque nella tua configurazione. Avrai bisogno di un paio di server, bilanciamento del carico e tonnellate di altre incredibili cazzate tecnologiche. E uno di questi sarà ad esempio Solr;)