MySQL: Есть ли жизнь после 1 млрд. записей.

54
MySQL: Есть ли жизнь после 1млрд. записей? Лаухин Роман R&D Lead Global Fleet Management

description

Роман Лаухин, Lead Software developer at Positrace.

Transcript of MySQL: Есть ли жизнь после 1 млрд. записей.

Page 1: MySQL: Есть ли жизнь после 1 млрд. записей.

MySQL:

Есть ли жизнь после

1млрд. записей?

Лаухин Роман

R&D Lead

Global Fleet Management

Page 2: MySQL: Есть ли жизнь после 1 млрд. записей.

О компании

Global Fleet Management Inc.

#301 - 7 West 7th Avenue

Vancouver, BC, Canada

http://www.positrace.com

Page 3: MySQL: Есть ли жизнь после 1 млрд. записей.

О компании

Page 4: MySQL: Есть ли жизнь после 1 млрд. записей.

Проблема

Рост числа сообщений

Page 5: MySQL: Есть ли жизнь после 1 млрд. записей.

Проблема

Рост числа сообщений

~0.9 млн. сообщений в сутки

Page 6: MySQL: Есть ли жизнь после 1 млрд. записей.

Проблема

Рост числа сообщений

~0.9 млн. сообщений в сутки

~30 млн. в месяц

Page 7: MySQL: Есть ли жизнь после 1 млрд. записей.

Проблема

Рост числа сообщений

~0.9 млн. сообщений в сутки

~30 млн. в месяц

~360 млн. в год

Page 8: MySQL: Есть ли жизнь после 1 млрд. записей.

Проблема

Рост числа сообщений

~0.9 млн. сообщений в сутки

~30 млн. в месяц

~360 млн. в год

+ 15%

Page 9: MySQL: Есть ли жизнь после 1 млрд. записей.

Проблема

На "вчерашний" день:

rows data size idx size total size

GPS_log 1163.45M 105.94G 75.28G 181.21G

Page 10: MySQL: Есть ли жизнь после 1 млрд. записей.

Проблема

На "вчерашний" день:

rows data size idx size total size

GPS_log 1163.45M 105.94G 75.28G 181.21G

Events 22.22M 2.17G 2.36G 4.53G

Trips 16.02M 1.71G 1.62G 3.33G

Page 11: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Хранить точки как массив объектов

(JSON, Protobuf, etc)

Page 12: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Хранить точки как массив объектов

(JSON, Protobuf, etc)

плюсы:

- контролируемый рост числа записей

Page 13: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Хранить точки как массив объектов

(JSON, Protobuf, etc)

плюсы:

- контролируемый рост числа записей

- информация о поездке в 1-2 записях

Page 14: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Хранить точки как массив объектов

(JSON, Protobuf, etc)

минусы:

- много изменений в коде

Page 15: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Хранить точки как массив объектов

(JSON, Protobuf, etc)

минусы:

- много изменений в коде

- усложняется работа с точками

Page 16: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Использовать "Partitioning"

Page 17: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Использовать "Partitioning"

плюсы:

- контролируемый рост

Page 18: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Использовать "Partitioning"

плюсы:

- контролируемый рост

- ускорение выполнения запросов

Page 19: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Использовать "Partitioning"

плюсы:

- контролируемый рост

- ускорение выполнения запросов

- не требует изменений в коде

(теоретически)

Page 20: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Использовать "Partitioning"

минусы:

- ограничения, связанные с разделами

Page 21: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Использовать "Partitioning"

минусы:

- ограничения, связанные с разделами

- нет опыта

Page 22: MySQL: Есть ли жизнь после 1 млрд. записей.

Пути решения

Использовать "Partitioning"

минусы:

- ограничения, связанные с разделами

- нет опыта

- страшно :)

Page 23: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Анализ ограничений

(PK, FK)

Page 24: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Анализ ограничений

(PK, FK)

План разбиения на разделы

(дата - ключевой параметр)

Page 25: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

ALTER TABLE ???

Page 26: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

ALTER TABLE !!!

Page 27: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

CREATE TABLE messages_new

.... PRIMARY KEY (id, dt) ...

PARTITION BY RANGE (TO_DAYS(dt))

( PARTITION p0801 VALUES LESS THAN

(TO_DAYS('2008-02-01')),

PARTITION p0802 VALUES LESS THAN

(TO_DAYS('2008-03-01')),

PARTITION p0803 VALUES LESS THAN

(TO_DAYS('2008-04-01')),

...

PARTITION p1212 VALUES LESS THAN (MAXVALUE));

Page 28: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Копирование данных в новую таблицу.

Page 29: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Копирование данных в новую таблицу.

- внешним скриптом

- малыми порциями

(INSERT LOW_PRIORITY ...)

Page 30: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

RENAME TABLE

messages TO messages_old,

messages_new TO messages;

Page 31: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Анализ первого опыта:

Page 32: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Анализ первого опыта:

- не без проблем

(тестовое окружение != production)

Page 33: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Анализ первого опыта:

- не без проблем

(тестовое окружение != production)

- скорость выполнения запросов

(возросла ~100 раз)

Page 34: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Анализ первого опыта:

- не без проблем

(тестовое окружение != production)

- скорость выполнения запросов

(возросла ~100 раз)

(связано с partitioning только косвенно)

Page 35: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Повторили предыдущие шаги для GPS_log и

связанных таблиц

Алгоритм известен -

соли и специй добавить по вкусу :)

Page 36: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Удаление старых таблиц

Page 37: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Удаление старых таблиц

DROP TABLE

Page 38: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Удаление старых таблиц

DROP TABLE

Page 39: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Удаление старых таблиц

- внешним скриптом

Page 40: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Удаление старых таблиц

- внешним скриптом

- малыми порциями

(DELETE LOW_PRIORITY)

Page 41: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Удаление старых таблиц

- внешним скриптом

- малыми порциями

(DELETE LOW_PRIORITY)

- OPTIMIZE TABLE

(в период с минимальной нагрузкой)

Page 42: MySQL: Есть ли жизнь после 1 млрд. записей.

Реализация

Удаление старых таблиц

- внешним скриптом

- малыми порциями

(DELETE LOW_PRIORITY)

- OPTIMIZE TABLE

(в период с минимальной нагрузкой)

- DROP TABLE

Page 43: MySQL: Есть ли жизнь после 1 млрд. записей.

Итоги

На сегодняшний день:

rows data size idx size total size

GPS_log 1321.81M 94.11G 112.63G 206.74G

Page 44: MySQL: Есть ли жизнь после 1 млрд. записей.

Итоги

Код, таки, пришлось менять :)

Page 45: MySQL: Есть ли жизнь после 1 млрд. записей.

Итоги

Код, таки, пришлось менять :)

Ограничение по дате (dt) обязательно

Page 46: MySQL: Есть ли жизнь после 1 млрд. записей.

Итоги

Код, таки, пришлось менять :)

Ограничение по дате (dt) обязательно

Не забывать расширять последний раздел

Page 47: MySQL: Есть ли жизнь после 1 млрд. записей.

Итоги

Код, таки, пришлось менять :)

Ограничение по дате (dt) обязательно

Не забывать расширять последний раздел

Помнить про файловую систему

Page 48: MySQL: Есть ли жизнь после 1 млрд. записей.

Полезности

EXPLAIN PARTITIONS ....

Page 49: MySQL: Есть ли жизнь после 1 млрд. записей.

Полезности

EXPLAIN PARTITIONS ....

id select_type table partitions type .... Extra

1 SIMPLE l p0xx,p1202 ALL ... Using where; Using filesort

Page 50: MySQL: Есть ли жизнь после 1 млрд. записей.

Полезности

INFORMATION_SCHEMA - наш друг

Page 51: MySQL: Есть ли жизнь после 1 млрд. записей.

Полезности

INFORMATION_SCHEMA - наш друг

SELECT concat(table_schema,'.',table_name),

concat(round(table_rows/1000000,2),'M') rows,

concat(round(data_length/(1024*1024*1024),2),'G') DATA,

concat(round(index_length/(1024*1024*1024),2),'G') idx,

concat(round((data_length+index_length)/(1024*1024*1024),2),'G')

total_size,

round(index_length/data_length,2) idxfrac

FROM information_schema.TABLES

ORDER BY data_length+index_length DESC LIMIT 20;

Page 52: MySQL: Есть ли жизнь после 1 млрд. записей.

Полезности

INFORMATION_SCHEMA - наш друг

name rows data idx total

table_1 1329.84M 94.29G 112.84G 207.13G

table_2 1314.38M 105.94G 75.28G 181.21G

table_3 221.73M 34.86G 17.09G 51.96G

table_4 161.92M 13.02G 10.19G 23.21G

table_5 8.07M 18.58G 0.16G 18.74G

Page 53: MySQL: Есть ли жизнь после 1 млрд. записей.

Вопросы?

Page 54: MySQL: Есть ли жизнь после 1 млрд. записей.

Ресурсы

MySQL 5.1 Reference Manual :: 18 Partitioning

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html