Я читал о некоторых реальных проблемах с БД, и у одного проекта была таблица с более чем 100 миллионами строк и пятью столбцами в качестве основного. Я думаю, что это плохо, но кто-нибудь может сказать мне, почему?
Таблица была своего рода таблицей микро-свертки / агрегации, поэтому 5 столбцов были похожи (день, market_id, product_id ...). Сначала я думал, что первичный ключ из 5 столбцов не идеален, но чем больше я думал, тем больше не мог найти вескую причину, по которой он был плохим.
Это было в конце ночной дискуссии с половиной инженеров компании. Кто-то только что упомянул, что это плохой дизайн, согласился один старший инженер, но никто не задумывался, почему. Таким образом, пытаясь исследовать вопрос для себя!
mysql
database-design
primary-key
JeffLL
источник
источник
Ответы:
Есть проблемы производительности с очень сложными первичными ключами. И это может не защищать от дублирования, а может быть более простой первичный ключ.
Однако существует один шаблон проектирования, который часто выдает таблицы с первичным ключом, состоящим из примерно шести компонентов. Это таблицы фактов звездной схемы. Если таблица фактов звездообразной схемы имеет шесть измерений, то первичный ключ будет иметь шесть компонентов. Я никогда не видел таблицу фактов без объявленного первичного ключа, и я думаю, что она того стоит, хотя процесс ETL все еще должен быть написан довольно тщательно.
Некоторые базы данных отчетов имитируют схему звездообразной схемы, даже если она явно не разработана таким образом.
Более 100 миллионов строк не слишком велики для таблицы фактов, особенно в современных больших данных.
источник
Тогда это не только хорошо, это «правильно».
И он пахнет как Сводная таблица, так как он начинается с
day
.У вас есть какие-то вторичные индексы? Имейте в виду, что если вы используете InnoDB, остальные столбцы PRIMARY KEY будут добавлены в конец вторичного индекса. Опять же, это не обязательно проблема.
100M рядов это много для накопления. Похоже, стол слишком мелкий. То есть, возможно, вместо этого, если (date, a, b, c, d) у вас должно быть 4 свертки с PK, такими как (date, a, b, c), (date, b, c, d), (date, c, d, a), (дата, d, a, b) (или некоторые подходящие комбинации). Я сделал это, каждая из которых может быть только 10M строк, тем самым делая отчеты еще быстрее, и в то же время обладает почти такой же гибкостью в отчетах.
Или, может быть, переключиться на (неделя, а, б, в, г), в результате чего может быть только 14 миллионов строк. (Вероятно, больше.)
Использование PARTITION для облегчения сокращения --- Высокоскоростное употребление --- Советы по хранилищу данных --- Сводные таблицы . Они суммируют многие из методов, которые я разработал в нескольких проектах DW. Как вы можете сделать вывод, каждый проект отличается. «Типичное» количество сводных таблиц (по моему опыту) составляет 3-7. Целью суммирования является 10 строк фактов -> 1 строка итогов. (Это может быть «медиана».) В редких случаях я суммировал сводную таблицу. В другом редком случае я РАЗДЕЛИЛ сводную таблицу с хорошим эффектом; Обычно сводные таблицы достаточно малы, поэтому они достаточно быстры для прямого доступа из пользовательского интерфейса.
источник
Ну, на самом деле наличие ПК с 5+ столбцами само по себе не обязательно плохо.
Это становится плохим, когда PK также является кластерным индексом, так как он будет считаться идентификатором строки и, таким образом, будет добавляться к каждой строке в индексе NC. Это резко увеличило бы необходимое пространство.
Также было бы плохо, если бы вы на самом деле использовали PK другим FK, так как вы должны располагать данными всех 5+ столбцов как в текущей таблице, так и в одной, ссылающейся на. Еще раз это значительно увеличит хранилище!
С точки зрения производительности это будет плохо, если PK будет использоваться в качестве индекса - пусть он будет находиться только внутри таблицы или вместе с FK - поскольку больший PK-ключ, содержащий более 5 столбцов, займет больше места, поэтому меньше записей будет вписывается в страницу, и отныне нужно читать больше страниц для анализа индекса.
Тем не менее, всегда может быть веская причина для этого, как, например, таблица фактов. Поэтому лучший ответ на самом деле будет таким, как в большинстве случаев: это зависит!
С уважением, Деннис
источник
Вот уже 15 с лишним лет мне не нужен такой ключ, я его иногда видел, и он только доставлял неприятности. Много неприятностей. Прежде всего первичный ключ для хранения целостности данных, и они должны быть синтаксическими. Они не должны иметь никакого отношения к реальному миру. Почему ? Как только реальный мир изменится, и он, несомненно, утратит ваш первичный ключ, и вам придется обновить его, а также всю связанную информацию.
Возможно, вам нужно запомнить этот кер в какой-то другой таблице / базе данных / сервисе, а не в одном поле, вам нужно скопировать несколько, и вы можете забыть скопировать некоторые из них. Вместо sysntetic первичный ключ, это просто одна часть данных, которую вы должны предоставить. Я не говорю об уникальности индекса, который может стать еще одной огромной темой для обсуждения.
Итак, краткое резюме, синтаксический первичный ключ (автоинкремент, guid, ..) прост в обслуживании, копировании, ...
Итак, я рассматриваю синтаксический первичный ключ и еще один ключ для 5 упомянутых вами столбцов.
Наконец, если таблица является только агрегированной, и никогда и никому не понадобится ссылаться на строку по ключам (но мир меняется, поверьте мне, по крайней мере для меня, он меняется навсегда), я, вероятно, оставлю ее как есть (первичная) ключ с пятью рядами), но в случае, если мы привыкли, это всегда вызывает много проблем. Так я тебе и сказал.
источник