sql >> Database >  >> RDS >> Mysql

MySQL-optimalisatie INSERT-snelheid wordt vertraagd vanwege indices

Als je snelle inserts wilt, is het eerste wat je nodig hebt de juiste hardware. Dat veronderstelt voldoende RAM, een SSD in plaats van mechanische schijven en een vrij krachtige CPU.

Aangezien u InnoDB gebruikt, wilt u het optimaliseren, aangezien de standaardconfiguratie is ontworpen voor langzame en oude machines.

Hier leest u veel over het configureren van InnoDB

Daarna moet u één ding weten - en dat is hoe databases intern hun werk doen, hoe harde schijven werken enzovoort. Ik zal het mechanisme vereenvoudigen in de volgende beschrijving:

Een transactie is MySQL die wacht op de harde schijf om te bevestigen dat de gegevens zijn geschreven. Daarom zijn transacties traag op mechanische schijven, ze kunnen 200-400 invoer-uitvoerbewerkingen per seconde uitvoeren. Vertaald, betekent dit dat u 200-achtige invoegquery's per seconde kunt krijgen met behulp van InnoDB op een mechanische schijf. Uiteraard dit is een vereenvoudigde uitleg , om te schetsen wat er gebeurt:het is niet het volledige mechanisme achter de transactie .

Aangezien een query, vooral degene die overeenkomt met de grootte van uw tabel, relatief klein is in termen van bytes, verspilt u in feite kostbare IOPS aan een enkele query.

Als u meerdere zoekopdrachten (100 of 200 of meer, er is geen exact aantal, u moet testen) in een enkele transactie verpakt en deze vervolgens vastlegt, behaalt u onmiddellijk meer schrijfbewerkingen per seconde.

Percona-jongens behalen 15k-inserts per seconde op relatief goedkope hardware. Zelfs 5k voegt een seconde in is niet slecht. De tabel zoals de jouwe is klein, ik heb tests gedaan op een vergelijkbare tafel (3 kolommen meer) en ik ben erin geslaagd om 1 miljard records te krijgen zonder merkbare problemen, met behulp van een 16 gb ram-machine met een 240 GB SSD (1 schijf, geen RAID, gebruikt voor testdoeleinden).

TL;DR:- volg de link hierboven, configureer je server, koop een SSD, verpak meerdere inserts in 1 transacties en profiteer. En schakel indexering niet uit en weer in, het is niet altijd van toepassing, omdat u op een gegeven moment verwerkings- en IO-tijd zult besteden aan het bouwen ervan.



  1. Een Amazon Aurora-cluster maken

  2. SQLite FULL OUTER JOIN-emulatie

  3. Telkolom bijwerken vanuit gegevens in een andere tabel

  4. Impact van het definiëren van VARCHAR2-kolom met grotere lengte