sql >> Database >  >> RDS >> Mysql

MySQL sleutels uitschakelen en inschakelen

Je moet zeker je aanpak kiezen op basis van het motortype... optimaliseren van voor MyISAM of voor InnoDB .

We hebben onlangs een benchmark uitgevoerd waarin we verschillende manieren hebben vergeleken om gegevens in te voegen en de tijd gemeten van vóór het inbrengen en totdat alle indices volledig zijn hersteld. Het stond op een lege tafel, maar we gebruikten tot 10 miljoen rijen.

MijnISAM met LOAD DATA INFILE en ALTER TABLE ... ENABLE/DISABLE KEYS won zonder twijfel in onze test (op een Windows 7-systeem, MySQL 5.5.27 - nu proberen we het op een Linux-systeem).

TOETSEN IN- en UITSCHAKELEN werkt niet voor InnoDB, het is alleen MyISAM. Gebruik voor InnoDB SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; als u zeker weet dat uw gegevens geen dubbele gegevens bevatten (vergeet niet deze in te stellen op 1 nadat de upload is voltooid).

Ik denk niet dat je OPTIMIZE TABLE nodig hebt na een bulkinvoeging - MySQL-rijen worden geordend door invoeging en de index wordt hoe dan ook opnieuw opgebouwd. Er is geen "extra fragmentatie" door een bulkinvoeging te doen.

Voel je vrij om commentaar te geven als ik feitelijke fouten heb gemaakt.

UPDATE: Volgens onze meer recente en volledige testresultaten is het advies om de toetsen UITSCHAKELEN / INSCHAKELEN verkeerd te doen.

Een collega liet een programma meerdere verschillende tests uitvoeren - een tabel met InnoDB / MyISAM voorgevuld en leeg, selectie- en invoegsnelheden met LOAD DATA LOCAL , INSERT INTO , REPLACE INTO en UPDATE , op "dichte" en "gefragmenteerde" tabellen (ik weet niet precies hoe, ik denk dat het in de trant van DELETE FROM ... ORDER BY RAND() LIMIT ... met een vaste seed dus het is nog steeds vergelijkbaar) en ingeschakelde en uitgeschakelde indices.

We hebben het getest met veel verschillende MySQL-versies (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) op Windows en Linux (niet dezelfde versies op beide besturingssystemen). MyISAM won alleen als de tafel leeg was. InnoDB was sneller als er al gegevens aanwezig waren en presteerde over het algemeen beter (behalve voor hdd-space - MyISAM is kleiner op schijf).

Maar om er echt van te profiteren, moet je het zelf testen - met verschillende versies, verschillende configuratie-instellingen en veel geduld - vooral met betrekking tot rare inconsistenties (5.0.97 was een stuk sneller dan 5.5.27 met dezelfde configuratie - we ben nog op zoek naar de oorzaak). Wat we wel vonden was dat DISABLE KEYS en ENABLE KEYS zijn bijna waardeloos en soms schadelijk als je niet met een lege tafel begint.



  1. Stop met SQL Server je vuile werk te laten doen

  2. Kies uit dezelfde tabel als een Insert of Update

  3. Een array met waarden verzenden naar de Oracle-procedure om te gebruiken in de WHERE IN-clausule

  4. Mysql verbetert de SELECT-snelheid