sql >> Database >  >> RDS >> Mysql

Optimaliseren SELECTEER ... WAAR IN (...)

SELECT * FROM  products                         <<-- select * is non-optimal
WHERE  prodid in (10331,11639,12127..) 
ORDER BY Field(prodid, 10331,11639,12127...);   <<-- your problem is here

Zet eerst een index op prodid zie het antwoord van @Anthony.

Verander dan de zoekopdracht om te lezen:

SELECT only,the,fields,you,need FROM  products
WHERE  prodid in (10331,11639,12127..) 
ORDER BY prodid

Als u ervoor zorgt dat uw IN lijst wordt oplopend gesorteerd voordat deze wordt aangeboden aan de IN clausule, de order by prodid zal hetzelfde resultaat opleveren als order by field(...

  • Het gebruik van een functie in plaats van een veld verkleint elke kans op het gebruik van een index, wat traagheid veroorzaakt.
  • select * haalt gegevens op die u misschien niet nodig hebt, wat extra schijftoegang en extra geheugengebruik en extra netwerkverkeer veroorzaakt.
  • Op InnoDB, als je alleen select geïndexeerde velden, MySQL zal nooit de tabel lezen, maar alleen de indexbesparingstijd (in uw geval is dit echter waarschijnlijk geen probleem)

Er zijn een paar trucjes die je kunt gebruiken.

  • Als de producttabel niet te groot is, kun je er een memory van maken tabel, die is opgeslagen in RAM. Doe dit niet voor grote tafels, het vertraagt ​​andere dingen.
    Je kunt alleen hash gebruiken indexen op geheugentabellen.
  • Als de prodid's continu zijn, kunt u BETWEEN 1000 AND 1019 gebruiken in plaats van
    IN (1000, 1001 ..., 1019)


  1. Welke vaardigheden en kennis hebben databaseontwerpers nodig?

  2. mysql-query met zoals %..% in de waar-clausule die verschillende resultaten oplevert

  3. SQL QUERY meerdere zoekopdrachten in één rij om gegevens uit een andere rij in dezelfde tabel te vinden

  4. Query voor gebruikers die niet in een specifieke groep zitten? (Wilde BEHALVE gebruiken, maar het lijkt erop dat MySQL dit niet ondersteunt)