Видаляючи великі обсяги (4 мільйони рядків) даних mysql ефективно, дуже регулярно


10

У нас є таблиця mysql, яка в будь-який момент налічує близько 12 мільйонів рядків. Нам потрібно видалити старі дані, щоб розмір таблиці був дещо керованим.

Зараз ми виконуємо цей запит щодня, опівночі, використовуючи завдання cron:

DELETE FROM table WHERE endTime < '1393632001'

В останній раз, коли запит був проведений, він вивчив 4 602 400, зайняв 3 хвилини і процесор пройшов крізь дах.

Процесор шипить опівночі

Що ми можемо зробити, щоб центральний процесор, синхронні db-з'єднання, глибина диска тощо не безпідставно шипили, зберігаючи при цьому старі дані?

PS: Ви помітите, що запит насправді відбувається у досить невідповідний час у нашому циклі використання. Припустимо, що ми вже змістили час запиту, який має відбуватися в найнижчій точці використання кожного дня. Крім того, немає індексу на "endTime", і я вважаю за краще зберігати його таким чином, якщо це можливо, тому що тонна даних вставляється дуже регулярно, і не дуже багато пошуку.

php  mysql 

можливо, Використовуйте завдання cron, щоб видаляти кожні 10 хвилин та 100 тис. за раунд або кожні 5 хвилин 50 тис. за раунд

менші шматки на більш регулярній основі?

гаразд, але здається, що це може просто калічити наш досвід користувача протягом більш тривалих періодів часу :) все, що ми можемо робити запит / дизайн розумно?

1
Користувачі 186k, не завзятий хлопець?

1
Ви отримаєте кращі відповіді на тему "Адміністратори бази даних"
Джеймс Андерсон

Відповіді:


13

Рішення вашої проблеми - це можливість MySQL під назвою "розділення". Документація тут .

Розбиття розділів - це зберігання однієї таблиці в окремих "розділах". Вони визначаються конкретним виразом, зазвичай значенням стовпця або діапазоном. У вашому випадку це, мабуть, ґрунтувалося б endTime- припускаючи, що відомо, коли створюється запис, і він не змінюється.

Ви б зберігали день endTimeу кожній секції . Тоді крок видалення буде обрізанням розділу, а не видаленням рядків у великій таблиці. Урізання розділів було б набагато швидшим методом.


Нічого, це було неймовірно корисно, і, здається, ідеальне рішення. Час читати на розбитті! Дякую!

Хоча розділення може бути хорошим рішенням, остерігайтеся накладних витрат - це може значно уповільнити ваші запити. До того ж таблиця урізання також не є миттєвою. Я б вважав pt-архіватором. Ви можете вирішити свої проблеми шипами і зберегти стіл таким же простим, як зараз
akuzminsky
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.