mysql, postgre, mongodb и снова mysql

Nov 26, 2009 19:27


На работе столкнулся с досадным недостатком mysql: он не умеет делать слияние отсортированных индексом массивов.

На пальцах: пусть есть таблица  objects (id, category_id, time) с индексом (category_id, time). Задача - выбрать среди данных нескольки категорий N последних.

Запрос:
SELECT  * FROM objects WHERE category_id IN (10,11,12,13, 14) ORDER BY time DESC LIMIT 10;
даже не думает работать по индексу. Он отбирает все объекты из этих категорий, сортирует их filesort’ом и потом отбирает первые. Хотя очень логично поступить аналогично сортировке слиянием: взять отсортированные последовательности для каждой категории и сливать их, пока не получим N элементов.

Итак, мелькнула идея попробовать применить PostgreSQL. Поставил, перелил в него таблицу, сделал аналогичные запросы - он приятно удивил: 0.5-0.6 секунд против 2.5-3.0 в мускуле. Причём Постгре был под виндой, а Мускул под FreeBSD. Не могу точно утверждать, индексы разруливает лучше или просто сыграл тот факт, что движок быстрее (а он реально быстрее), потому что он и без проставленных индексов работал быстрее мускула (в районе 1.0-1.5 сек).

Я бы на этом и остановился, но шеф настоял, чтобы я попробовал MongoDB. Опустив лирику, могу только подписаться под резюме: “Быстрый, как понос”. Для той же самой задачи он дал результаты порядка 0.2-0.3 сек.

И уже все были готовы перейти на использование MongoDB, как вдруг мелькнула шальная мысль. Сделали копию таблицу в Mysql MEMORY engine, внесли данные в нужном порядке, убрали (!) все индексы. Ура! Результаты порядка 0.02-0.05 сек.

Что тут сказать… Универсальных решений не бывает, вот и всё.

Это кросспост с моего блога. Оригинальный пост на моём сайте.

программирование, Работа, работа, mysql

Previous post Next post
Up