Премахване на големи обеми от данни от MySQL таблици
Ако трябва да изтриете десетки и стотици хиляди записи от таблица, вие знаете, че това е бавен. Ясно е, че като Mysql в този случай трябва да отидете на всеки запис и да го премахнете от диска.
В .io ние използваме (така наречените) прозорец на маса. Това е мястото, където се съхраняват данните в таблицата само през последния час (или друг период от време). Така че, вие не само да пиша много, но много от тях са премахване. Ако загуба на данни не е фатално, че е възможно да се използва таблица памет. Въпреки това, в повечето случаи е, разбира се, тя няма да работи. След загуба на данни всеки път, когато не искате сървърни рестартира.
Защо DELETE е бавен
На първо място, трябва да се разбере, че премахването на 10 хиляди записи -. Това е 10 хиляди на заличаването на записи .. Но всяко премахване - няколко сделки запис на промени (данните и индексите) на диска.
Освен това, преди да изтриете записи, MySQL, трябва първо да ги изберете. И в този случай същите правила като в пробите. Ако индекси са конфигурирани лошо, изтриване операция ще стане по-бавно.
Инсталиране на индекса
За да тествате използването на показатели, достатъчно е да се замени за изтриване изберете броя (*).
# Разберете, ако той използва индекс
# Сменете SELECT ще тества използването на индекси
След това можем да бъдем сигурни, че проблемът е в индекса:
# Необходимо е да се създаде индекс на колона TS да се ускори премахването на
Използването на дялове
Индекси помогнат за премахването на сравнително малки суми. Все пак, ако постоянно трябва да се отстранят много (както е в нашия случай), то е необходимо да се разгледа разделяне. Разделяне ви позволява да се раздели масата на няколко физически блокове
Това означава, че ние ще бъдем в състояние да манипулират отделните дялове. И вместо премахването на голям брой записи, ние ще бъдем в състояние да ги обедини в един единствен елемент (дял) и го отстранете с една операция.
За да проверите това на практика, ние ще създадем проста таблица на тази структура:
# ID, позиция и дата на създаване на заглавие
Запълнете го с резултати от изследвания (десетки хиляди записи) и изтриване на данни:
# Изтрийте някои данни от таблица
Искането е доста бавен, отстраняват се около 25 000 вписвания .:
Нека да се уверите, че проблемът не е в индекса (ние го е създал, но само в случай, проверка):
Виж, че се използва индекса - всичко е добре тук:
Също така проверете променлива система, която показва броя на изтритите записи на всички InnoDB таблици:
# Вижте броя на изтритите редове
Ние сме провеждане на експеримент, в тестовата среда, така че и другите дистанционно не се случва.
Изборът на схема за разделяне
Тъй като ние реши да отстрани проблема, трябва да имаме схема, в която ние ще бъдем в състояние да премахне удобно (чиста) на целия дял. Ние трябва да изтриете данните за един час, така че ние ще създадем HASH дял въз основа на часа поле час и дата.
# 24 прегради, защото 24 часа в денонощието
Просто се опитай погледнете в разпределението на нашия дял с данни:
# Номер на разпределение ще съответства на колона часа дата и час
Както можете да видите, данните в таблицата са поставени само две прегради. Те съответстват на текущата и предходната час. Това, което трябва - е да се почисти дял за час, че вече не е необходимо. За тази цел има съкращава работа.
# Тази операция се изпълнява за (0.01 сек)
Ако ние проверяваме метрови дистанционно записите на InnoDB, виждаме, че:
# Стойността не се променя
Това потвърждава факта, че не съкращава работи основно като изтриете. Вместо да изтривате всеки запис, на масата (или дял) се изчиства до ниво структура. Ако тя е много грубо, след отстраняване на старата Mysql файла на базата данни и се създава нова. И тази операция е много по-бързо прогресивно премахване.
Ако е необходимо да се премахне големи количества данни от MySQL, следват две съвети:- Изграждане индекси на вземането на проби скорост при отстраняване, подмяна изтриете от по ОБЯСНЕТЕ изберете броя (*) FROM.
- Използвайте разделяне и TRUNCATE PARTITION за ефективното премахване на голям брой редове.
![Премахване на големи обеми от данни от MySQL таблици (на данни) Премахване на големи обеми от данни от MySQL таблици](https://webp.images-on-off.com/7/296/434x119_fukhu92sab2qhqiv1jet.webp)