Мы находимся в процессе перехода от MySQL к PGSQL, и у нас есть таблица из 100 миллионов строк.
Когда я пытался выяснить, сколько места используют обе системы, я нашел гораздо меньше различий для таблиц, но нашел огромные различия для индексов.
Индексы MySQL занимали больше размера, чем сами данные таблицы, а postgres использовали значительно меньшие размеры.
-
При переходе по этой причине я обнаружил, что MySQL использует деревья B + для хранения индексов и postgres использует B-деревья.
-
Использование индексов MySQL было немного иным, оно хранит данные вместе с индексами (из-за которых увеличивается размер), но postgres этого не делает.
Теперь вопросы:
-
Сравнение B-tree и B + деревьев в базе данных говорит, лучше использовать деревья B +, так как они лучше подходят для запросов диапазона O (m) + O (logN) - где m в диапазоне и поиске логарифмически в деревьях B +?
Теперь в B-деревьях поиск является логарифмическим для запросов диапазона, которые он снимает до O (N), так как он не имеет связанной структуры списка для узлов данных. С учетом сказанного, почему postgres использует B-деревья? Он хорошо работает для запросов диапазона (он делает, но как он обрабатывает внутренне с B-деревьями)?
-
Вышеупомянутый вопрос с точки зрения postgres, но с точки зрения MySQL, почему он использует больше хранилища, чем postgres, какова эффективность использования деревьев B + в действительности?
Я мог бы пропустить/неправильно понять многие вещи, поэтому, пожалуйста, не стесняйтесь исправить мое понимание здесь.
Изменить для ответа на вопросы Рика Джеймса
- Я использую движок InnoDB для MySQL
- Я построил индекс после заполнения данных - так же, как в postgres
- Индексы не являются УНИКАЛЬНЫМИ индексами, просто нормальными индексами
- Не было случайных вставок, я использовал загрузку 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, игнорируя первичный ключ, поскольку он кластерный, так что мы действительно можем видеть, какой тип занимает больше размера, если таковой имеется.