Мы находимся в процессе перехода от MySQL к PGSQL, и у нас есть таблица из 100 миллионов строк.Использование Postgres индексов btree против MySQL B + деревьев
Когда я пытался выяснить, сколько пространства используют обе системы, я нашел гораздо меньше различий для таблиц, но обнаружил огромные различия для индексов.
Индексы MySQL занимали больше места, чем данные таблицы, а postgres использовали значительно меньшие размеры.
При рытье через по той причине, я обнаружил, что MySQL использует B + деревьев для хранения индексов и Postgres uses B-деревьев.
Использование индексов MySQL было немного иным, оно хранило данные вместе с индексами (из-за которых увеличился размер), но postgres этого не делает.
Теперь вопросы:
Сравнение B-дерева и B + деревья на базе говорят, что лучше использовать B + деревья, так как они лучше для диапазона запросов O (M) + O (logN) - где m в диапазоне и поиске является логарифмическим в деревьях B +?
В настоящее время в B-деревьях поиск является логарифмическим для запросов диапазона, которые он снимает до O (N), поскольку он не имеет связанной структуры списка для узлов данных. С учетом сказанного, почему postgres использует B-деревья? Он хорошо работает для запросов диапазона (он делает, но как он обрабатывает внутренне с B-деревьями)?
Этот вопрос относится с точки зрения postgres, но с точки зрения MySQL, почему он использует больше хранилища, чем postgres, какова эффективность использования деревьев B + в действительности?
Возможно, я пропустил/неправильно понял многие вещи, поэтому, пожалуйста, не стесняйтесь исправить мое понимание здесь.
Edit для ответа Рик Джеймс расспрашивает
- Я использую InnoDB двигатель для MySQL
- Я построил индекс после заполнения данных - так же я сделал в Postgres
- Индексы не являются UNIQUE индексы, только нормальные индексы
- Не было случайных вставок, я использовал загрузку csv как в postgres, так и в MySQL, и только после этого я создал индексы.
- Размер блока Postgres для обоих индексов и данных составляет 8 КБ, я не уверен в MySQL, но я его не менял, поэтому он должен быть по умолчанию.
- Я бы не назвал строки большими, у них было около 4 текстовых полей длиной 200 символов, 4 десятичных поля и 2 поля bigint - 19 номеров.
- P.K - колонка bigint с 19 номерами, я не уверен, что это громоздко? В каком масштабе следует дифференцировать громоздкие и непрозрачные?
- Размер таблицы MySQL составлял 600 МБ, а Postgres - около 310 МБ, включая индексы - это составляет 48% большего размера, если моя математика права. Но есть ли способ, чтобы я мог измерять размер индекса только в MySQL, исключая размер стола?Думаю, это может привести к лучшим цифрам.
- Информация о машине: у меня было достаточно ОЗУ - 256 ГБ, чтобы соответствовать всем таблицам и индексам вместе, но я не думаю, что нам нужно пройти этот маршрут вообще, я не видел заметной разницы в производительности в обоих из них.
Дополнительные вопросы
- Когда мы говорим, фрагментация происходит? Есть ли способ сделать де-фрагментацию, чтобы мы могли сказать, что помимо этого ничего не поделаешь. Кстати, я использую Cent OS.
- Есть ли способ измерения размера индекса в MySQL, игнорируя первичный ключ, поскольку он является кластеризованным, так что мы действительно можем видеть, какой тип занимает больше размера, если таковой имеется.
Не так часто возникает вопрос MySQL-vs-PostgreSQL, который является релевантным, конкретным и не в основном вопросом мнения. Я сам заинтересован в ответах, хотя, думаю, у вас возникнут проблемы с поиском глубоких знаний в * обеих * СУБД. –
Связанные: [Деревья B, разница деревьев B +] (http://stackoverflow.com/questions/870218/b-trees-b-trees-difference). – klin
@CraigRinger: Будем надеяться, что мы найдем ответы :) –