MySQL. Бързо зареждане на милиони редове в таблица

Не толкова отдавна бях изправен пред задачата да заредя 50 милиона реда в база данни за мускул. Да ви кажа, че е по-забавно. И така опитах и ​​така - на около двадесет милиона скоростта на теглене започна рязко да пада. Тези 20 милиона бяха изтеглени за около час. Следващият милион влезе в базата данни едва в края на деня. В резултатdetect намери изход:

      създайте временна таблица с желаната структура без индекси и ключове
      заредете данни с команда

Въпросът, както вече разбрахте, беше да се актуализират ключовете при зареждане на данни.

Да, те могат да направят това с индекси, в „големи“ СУБД, когато зареждат големи обеми, те обикновено се опитват да ги изключат преди качване и да ги включат след това.

Епопеята продължава. Сега съм изправен пред задачата да заредя около 100 милиона записа в таблица. Зарежда без проблеми. Забавлението започва, когато започнете да добавяте първичния ключ. Сървърът и мускулите почти умират. Не изчаках завършването на добавянето на ключа - от опасен начин прекъснах изпълнението на заявката, за да разтоваря сървъра.

Досега успя да победи мускула. Подозирам, че скоро ще има проблем да се съхраняват в него милиарди записи в една таблица. 🙂 Ето решението:

1. флаш таблици: FLUSH TABLES; 2. изключете ключовете във временната таблица (нейната структура е напълно идентична със структурата на таблицата, където трябва да поставите данните - с всички ключове): myisamchk —keys-used=0 -rq /path/to/db/tbl_new 3. плъзгане на данни от старата таблица в новата: вмъкнете в tbl_new изберете * от tbl_real; 4. зареждане на данни от файл: ЗАРЕДЕТЕ ДАННИ ВЪВ ФАЙЛ "/tmp/data.txt" ЗАМЕНИТЕ В ТАБЛИЦА tbl_new ПОЛЕТА, ЗАКРАЙНИ С ',' РЕДОВЕ, ЗАКРАЙНИ С "n"; 5. ключове за възстановяване: myisamchk --sort_buffer_size=50M -rqq /path/to/db/tbl_new (без да увеличава размера на буфера, myisamchk бързо се закле в липсата на памет - по подразбиране има буфер за сортиране само 2Mb) 6. флаш таблици: FLUSH TABLES; 7. преименувайте старата таблица: променете таблицата tbl_real преименувайте на tbl_old; 8. преименувайте новата таблица: променете таблицата tbl_new преименувайте на tbl_real;