Ускорение веб-аналитики с использованием column-
oriented СУБД
Иван Авсеянко
Возраст
Пол
Местоположение
Статистика хитов
Много чего ещё...
SQL*
*rulez
Какую СУБД выбрать?MySQL;PostgreSQL;Oracle;MS SQL...
Больше хитов – больше данных
Больше данных – больше проблемДля примера –
www.rambler.ru• 14 000 000 просмотров;• 200 байт на хит;• 2,6 ГБ логов в день;
Проблемы “традиционных” СУБД
• Запросы заранее неизвестны• Даже индексы могут не уместиться в RAM• Данные загружаются слишком медленно
OLTP
Иван Иванов 1 курс Факультет биологии
Группа 123
Петр Петров 1 курс Факультет биологии
Группа 132
Сидор Сидоров 1 курс Факультет экономики
Группа 190
Храним данные строками
Храним данные столбцами
Преимущества колонок
• Каждую колонку можно отсортировать по-своему• “Традиционные” индексы не нужны• Меньше операций seek при обработке многих
строк• Есть возможность эффективно сжимать данные
Колонка – массив однородных данных
Сжатые данные лучше, чем несжатые
• Уменьшение объёма данных• Значительное ускорение работы СУБД;• Для каждой колонки можно выбрать наиболее
подходящий алгоритм сжатия
Реализации
Open source and free!• Infobright (CE)• InfiniDB (CE)• MonetDB• LucidDB• ...;
C-Store (2006)Infobright (EE)InfiniDB (EE)Oracle...;
Infobright - плюсы• Лучшее сжатие на рынке• Неплохая скорость загрузки данных в БД• Хорошая скорость выполнения сложных
запросов
Infobright - минусы• Реализовано не очень большое подмножество
языка SQL (хотя есть медленный MySQL optimizer)
• Однопоточный загрузчик данных• Однопоточное выполнение запроса• Баги
InfiniDB - плюсы• Многопоточная загрузка данных• Многопоточное выполнение запросов• Довольно полная реализация SQL, с
возможностью выполнения DELETE, INSERT, UPDATE
• Поддержка транзакций (MVCC)
InfiniDB - минусы• Гигантский размер БД (сжатие доступно
только в EE)• Небыстрая загрузка данных (из-за
отсутствия компрессии)
Monet DB - плюсы• Довольно полная реализация SQL, включая
INSERT, UPDATE, DELETE• Есть сжатие данных• Поддержка транзакций (OCC)• Подержка Xquery и других интерфейсов к БД
Monet DB - минусы• Слабое сжатие данных• Относительно медленная загрузка данных
Тестовый набор данных• ~327,5 миллионов строк• 23 колонки• ~63 GB• 29 каталогов, 2814 файлов
Тестовая конфигурация• CPU: Intel Core 2 Duo E6550 @ 2.33GHz• RAM: 8GB• HDD: 1Tb SATA, 32Mb cache, 7200RPM• OS: Fedora 15, Linux kernel 2.6.40.4-
5.fc15.x86_64
Версии ПО• Infobright CE 4.0.4 x86_64• InfiniDB CE 2.2.2 x86_64• MonetDB 11.5.3 x86_64• MySQL 5.5.14 x86_64
Загрузка данных
MySQL/MyISAM• LOAD DATA LOCAL INFILE '$i' INTO TABLE test;• Время загрузки – 92 минуты 26 секунд• Размер данных – 63 Gb
Infobright CE• LOAD DATA LOCAL INFILE 'filename' INTO
TABLE test• Время загрузки – 216 минут• Размер данных – 8,5 Gb
MonetDB• COPY INTO test FROM 'file.log' DELIMITERS '\t'
LOCKED;• Время загрузки – 643 минуты• Размер данных – 63 Gb
InfiniDB• LOAD DATA LOCAL INFILE '$i' INTO TABLE test;• Время загрузки – > 24 часов • Размер данных – > 63 Gb
MySQL/InnoDB• LOAD DATA LOCAL INFILE '$i' INTO TABLE test;• Со сжатием (Barracuda)!• Время загрузки – 2,5 суток• Размер данных – 36 Gb
Выборки
SELECT COUNT(*) FROM test;
• MySQL/MyISAM – 0,03 секунды• Infobright CE – 0,6 секунды• MonetDB – 4,2 секунды• MySQL/InnoDB – 28 минут
SELECT country, state, SUM(imps) AS impressions, SUM(clicks) AS clicks FROM test WHERE is_fraud < 1 GROUP BY country, state ORDER BY country, state;
• Infobright CE – 7 минут 44 секунды• MySQL/MyISAM – 13 минут 31 секунда• MonetDB – 32 минуты 11 секунд• MySQL/InnoDB – 72 минуты 4 секунды
Другие результаты• http://www.mysqlperformanceblog.com/
2009/10/02/analyzing-air-traffic-performance-with-infobright-and-monetdb/
• http://www.mysqlperformanceblog.com/2010/01/07/star-schema-bechmark-infobright-infinidb-and-luciddb/
Как сделать выбор?Не используйте колоночные СУБД, если ваши
данные часто обновляются.Не используйте колоночные СУБД, если вам
не нужны сложные и непредсказуемые выборки.
Оптимизации IB• Данные колонок хранятся блоками по
65535 записей (DataPack), сжатие зависит не только от типа колонки, но и от содержимого блока;
Оптимизации IB• Для каждого DataPack хранятся
метаданные, такие как результат выполнения функций MAX(), MIN(), SUM(), AVG() для значений блока
Оптимизации IB• Планировщик запросов использует
метаданные для определения «нужных», «ненужных» и «подозрительных» блоков. Данные, которые не нужны, не читаются с диска и не разжимаются.
Советы по оптимизации IB• ServerMainHeapSize = 1/2 – 2/3 доступной RAM• LoaderHeapSize = не меньше 800 MB, если
позволяет память• DataFolder и CacheFolder лучше быть на разных
дисках• Без крайней необходимости не включайте
MySQLQueryOptimizer
Спасибо за внимание