sql >> Database >  >> RDS >> Mysql

Hoe efficiënt is het vanuit prestatieperspectief om een ​​tijdelijke MySQL-tabel te gebruiken voor een veelgebruikte websitefunctie?

Wat u zei is helemaal correct, de tijdelijke tabel is alleen zichtbaar voor de huidige gebruiker/verbinding. Toch is er wat overhead en enkele andere problemen, zoals:

  • Voor elk van de duizenden zoekopdrachten die je gaat maken en die tabel vullen (en later neerzetten) - niet per gebruiker, per zoekopdracht. Omdat elke zoekopdracht het script hoogstwaarschijnlijk opnieuw zal uitvoeren, en "per sessie" betekent niet PHP-sessie - het betekent databasesessie (open verbinding).
  • Je hebt de CREATE TEMPORARY TABLES . nodig privilege, dat u misschien niet hebben.
  • Toch zou die tabel eigenlijk het MEMORY-type moeten hebben, dat je RAM meer steelt dan het lijkt. Omdat zelfs met VARCHAR, MEMORY-tabellen gebruik maken van rijopslag met een vaste lengte.
  • Als je heuristiek later twee keer naar die tabel moet verwijzen (zoals SELECT xyz FROM patternmatch AS pm1, patternmatch AS pm2 ... ) - dit is niet mogelijk met MEMORY-tabellen.

Vervolgens zou het voor u - en ook voor de database - gemakkelijker zijn om de LIKE '%xyz%' toe te voegen rechtstreeks naar uw images tabellen WHERE clausule. Het zal hetzelfde doen zonder de overhead van het maken van een TEMP TABLE en het toevoegen ervan.

In ieder geval - het maakt niet uit welke kant je op gaat - dat WHERE zal verschrikkelijk traag zijn. Zelfs als u een index toevoegt op images.name je hebt hoogstwaarschijnlijk LIKE '%xyz%' . nodig in plaats van LIKE 'xyz%' , zodat de index niet wordt gebruikt.

Nee. :)

Alternatieve opties

MySQL heeft een ingebouwde Fulltext-Search (sinds 5.6 ook voor InnoDB) die je zelfs die score kan geven:ik raad je ten zeerste aan om het te lezen en te proberen. U kunt er zeker van zijn dat de database beter weet dan u hoe u die zoekopdracht efficiënt kunt uitvoeren.

Als u MyISAM gaat gebruiken in plaats van InnoDB, houd dan rekening met de vaak over het hoofd geziene beperking dat FULLTEXT-zoekopdrachten alleen iets opleveren als het aantal resultaten minder is dan 50% van het totale aantal tabelrijen.

Andere dingen waar je misschien naar zou willen kijken, zijn bijvoorbeeld Solr (Leuke introductie voor dat onderwerp zelf zou het begin zijn van http://en.wikipedia.org/wiki/Apache_Solr ). We gebruiken het in ons bedrijf en het doet geweldig werk, maar het vereist nogal wat leren.

Samenvatting

De oplossing voor uw huidige probleem zelf (de zoekopdracht) is om de FULLTEXT-mogelijkheden te gebruiken.

Om u een cijfer te geven, 10.000 oproepen per seconde is al niet "triviaal" - met honderdduizenden zoekopdrachten per seconde zijn het soort prestatieproblemen dat u tegenkomt overal in uw set-up. Je hebt een paar servers, load balancing en tal van andere geweldige technische onzin nodig. En een daarvan is bijvoorbeeld Solr;)



  1. Uitvoeren triggers opgeslagen procedures op SqlFiddle. Mysql

  2. Hoe BIT_LENGTH() werkt in MariaDB

  3. INSERT INTO ... SELECT zonder alle kolommen te detailleren

  4. Een afbeelding uploaden naar een MySQL-database met behulp van een blob