Нет ограничения по количеству строк в одной таблице.По мере того как таблица становится больше, возникает все больше и больше проблем.Столовая таблица отлично работает без нормализации и индексов;таблица миллиардов строк нуждается в обоих плюс сжатые типы данных.И т. Д. И т. Д. (В одном опросе 50M строк было около 96-го процентиля. Я видел более миллиарда строк в одной таблице.)
UUID высасывают производительность для огромных таблиц;старайтесь избегать их.(Да, упаковывать их в BINARY(16)
лучше, чем VARCHAR(36)
.
2/3 из моих таблиц, не использовать AUTO_INCREMENT
; вместо этого они имеют «естественный» PKИтак, ясно, я говорю «это зависит», когда речь идет о PK. UserID, вероятно, лучше всего сделать с SMALLINT UNSIGNED
или MEDIUMINT UNSIGNED
, в зависимости от того, ожидаете ли вы не более 64K или 16M пользователей. Редко это нужноINT
, намного меньше BIGINT
. (Их размеры составляют 2,3,4,8 байта соответственно.)
Недостаток не AUTO_INCREMENT
PK заключается в том, что копия PK сцепляетсяк каждому вторичному ключу, тем самым добавляя к их массе. Однако, грубо говоря:
- Большой PK, но без вторичных ключей: Fine
- Большой PK и one вторичный ключ: занимает примерно одинаковое дисковое пространство с ИИ или без него.
- Большой ПК и несколько вторичных клавиш: ИИ начинает светиться (в пространстве).
До не разбивайте большую таблицу на несколько небольших таблиц. Сложности огромны, выгода крошечная. Даже PARTITIONing
вряд ли обеспечит любой преимущество.
"Нормализация" столбцов большого размера с повторяющимися значениями - это обычно хорошая идея.(Экономит место, но JOIN
, чтобы собрать все вместе, неплохо.)
50M строк с этими 8 столбцами могут составить до 4 ГБ.Это не очень большое.Он не гарантирует игру в BLOB
(если код приложения действительно не предпочтет его таким образом.) Тем временем рассмотрим целочисленные типы меньшего размера, чем 4-байтовый INT
;рассмотрим UNSIGNED
;рассмотрим FLOAT
против `DOUBLE.
В MySQL нет эквивалента 'varint'.
Комментарии к http://www.agiledata.org/essays/keys.html:
- A«ключ» не обязательно однозначно идентифицирует строку.То же самое для «вторичного ключа».Требуется ключевое слово
UNIQUE
. - В MySQL
PRIMARY KEY
отличается тем, что уникально идентифицирует строку и «кластеризован» с данными. - В MySQL этопочти всегда предпочтительнее использовать
VARCHAR
вместо CHAR
. - В MySQL
AUTO_INCREMENT
обычно является предпочтительным методом для суррогатных ключей.