Максимальное количество записей в таблице базы данных MySQL

175

Каков верхний предел записей для таблицы базы данных MySQL. Мне интересно про автоинкрементное поле. Что будет, если я добавлю миллионы записей? Как справиться с такими ситуациями? Спасибо!

xpepermint
источник
16
Не говоря уже о 1,21 гигаваттах!
Бен
2
По крайней мере, если память служит, предел устанавливается механизмом хранения, поэтому (например), используя MyISAM, вы получаете другой предел, чем при использовании InnoDB.
Джерри Коффин
77
@ Лук-рыцарь: я не согласен. Нормально вставлять миллионы строк в одну таблицу, и некоторые базы данных имеют ограничение, поэтому стоит спросить. Если спросить, поддерживает ли MySQL миллионы таблиц , это, вероятно, признак архитектурной ошибки.
Билл Карвин

Ответы:

62

Типы mysql int могут содержать несколько строк: http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

без знака intнаибольшее значение 4,294,967,295
без знака bigintнаибольшее значение18,446,744,073,709,551,615

KM.
источник
8
2147483647 макс., Поэтому вам нужно делать автоинкремент bigint только в том случае, если вы работаете с несколькими миллиардами записей? (который, вероятно , просто сделать ваши заявления выберите растопить задолго до этого)
Kzqai
2
@Tchalvak для подписанного int, пожалуйста, прочитайте документацию по mysql.
Леандро
8
Контекст вопроса о том, может ли поле автоинкремента обрабатывать много строк, а не об ограничениях других ресурсов
КМ.
21
Плакат не спрашивает о числовых или любых других типах данных. , Я действительно не понимаю, как это можно пометить как правильный ответ. Хотя я должен признать, что вопрос неоднозначный, мы должны различать тип данных PK и максимальное количество строк в таблице.
Хлеб
1
@Bery, ОП отличил то, что они были после, выбрав это в качестве ответа. Очевидно, их интересовала емкость поля автоинкрементации, которое охватывает мой ответ, а не ограничения других ресурсов.
КМ.
238

Наибольшее значение целого имеет мало общего с максимальным количеством строк, которые вы можете сохранить в таблице.

Это правда, что если вы используете int или bigint в качестве первичного ключа, у вас может быть только столько строк, сколько число уникальных значений в типе данных вашего первичного ключа, но вам не нужно делать первичный ключ целым числом Вы можете сделать это символ (100). Вы также можете объявить первичный ключ более чем в одном столбце.

Существуют и другие ограничения на размер таблицы, кроме количества строк. Например, вы можете использовать операционную систему с ограничением размера файла. Или у вас может быть жесткий диск на 300 ГБ, который может хранить только 300 миллионов строк, если каждая строка имеет размер 1 КБ.

Пределы размера базы данных действительно высоки:

http://dev.mysql.com/doc/refman/5.1/en/source-configuration-options.html

Механизм хранения MyISAM поддерживает 2 32 строки на таблицу, но вы можете собрать MySQL с --with-big-tablesопцией, позволяющей поддерживать до 2 64 строк на таблицу.

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

Кажется, что механизм хранения InnoDB не имеет ограничения на количество строк, но он имеет ограничение на размер таблицы 64 терабайта. Сколько строк вписывается в это зависит от размера каждого ряда.

Билл Карвин
источник
62
дерьмо - я бы хотел прочитать это раньше ... я просто превзошел свой 64-терабайтный размер на одной из моих таблиц, и теперь моя система работает так медленно!
JM4
2 ^ 32 = 4 294 967 295 и 2 ^ 64 = 18 446 744 073 709 551 615, так что ... Наибольшее целочисленное значение имеет отношение к максимальному числу строк. Не обязательно первичный ключ.
Teynon
1
@Tom, InnoDB - это механизм хранения по умолчанию в MySQL 5.5, и он является лучшим выбором в 99% случаев.
Билл Карвин
2
@ Ext3h, Sphinx Search обычно лучше, чем полнотекстовые индексы в MyISAM или InnoDB.
Билл Карвин
1
Для mysql 8 ограничение составляет 256 ТБ при размере страницы 64 КБ.
UselesssCat
13

Я предлагаю никогда не удалять данные. Не говорите, что если таблицы длиннее 1000, обрежьте конец таблицы. В вашем плане должна быть реальная бизнес-логика, например, как долго этот пользователь неактивен. Например, если он длиннее 1 года, поместите их в другую таблицу. Это может произойти еженедельно или ежемесячно в сценарии обслуживания в середине медленного времени.

Когда вы сталкиваетесь со многими строками в своей таблице, вы должны начать сегментировать таблицы или разбивать их на части и помещать старые данные в старые таблицы по годам, такие как users_2011_jan, users_2011_feb или использовать числа для месяца. Затем измените ваше программирование для работы с этой моделью. Возможно, создайте новую таблицу с меньшим количеством информации, чтобы суммировать данные в меньшем количестве столбцов, а затем ссылаться на большие разделенные таблицы только тогда, когда вам нужно больше информации, например, когда пользователь просматривает свой профиль. Все это должно быть рассмотрено очень тщательно, поэтому в будущем это не слишком дорого, чтобы пересмотреть. Вы также можете поместить только пользователей, которые постоянно посещают ваш сайт, в одну таблицу и пользователей, которые никогда не попадают в заархивированный набор таблиц.

PHPGuru
источник
1
В связи с этим очень полезно взглянуть на разделы MySQL: dev.mysql.com/doc/refman/5.6/en/partitioning.html
Вим Deblauwe
10

В InnoDB с ограничением размера таблицы 64 терабайта и ограничением размера строки MySQL 65 535 может быть 1 073 741 824 строки. Это было бы минимальное количество записей, использующих максимальный предел размера строки. Однако можно добавить больше записей, если размер строки меньше.

Ксило
источник
для хранения такого количества (1 073 741 824) строк с пределом строки 65535, какой объем жесткого диска требуется? пожалуйста предложите
davidb
1
Требуемый размер жесткого диска не может быть определен на основе количества строк и только размера строки. Размер самой таблицы составит 64 терабайта. Однако данные столбцов TEXT и BLOB хранятся отдельно от строки и требуют дополнительного места. Кроме того, это будет зависеть от количества и типа столбцов TEXT и BLOB, поскольку их размер зависит от типа. Существует четыре типа столбцов TEXT, а именно: TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT. Существует также четыре типа столбцов BLOB, а именно: TINYBLOB, MEDIUMBLOB, BLOB и LONGBLOB.
Ксило
2

Согласно разделу «Масштабируемость и ограничения» в http://dev.mysql.com/doc/refman/5.6/en/features.html , поддержка MySQL для больших баз данных. Они используют MySQL Server с базами данных, которые содержат 50 миллионов записей. Некоторые пользователи используют MySQL Server с 200 000 таблиц и около 5 000 000 000 строк.

Данные
источник
это может помочь, если вы также даете нам знать, какое аппаратное обеспечение использовали «Они»
мой account_ram
Действительно, ты прав. Но, к сожалению, «они» ничего не делали об оборудовании
Data
@myaccount_ram Извините, что это некромантно, но если это полезно, я видел менее теоретические, более практические ограничения производства MySQL в действии. Я видел базу данных с ~ 18 миллиардами строк в 2x экземплярах AWS db.r4.16xlarge (1 читатель, 1 писатель). Каждая из машин имела 64 ядра ЦП, 488 ГБ оперативной памяти, сетевое соединение 25 Гбит / с, 64 ТБ диска. Эта шкала в дБ выдвигала ограничения как по размеру процессора, так и по объему диска, и AWS не предоставляет экземпляров, оптимизированных для больших БД. Он был заменен более простой схемой БД, которая не требовала столько строк.
Скайлар Браун
1

Пределы размера строки

The maximum row size for a given table is determined by several factors:
  • Максимальное значение размера строки во внутреннем представлении таблицы MySQL составляет 65 535 байт, даже если механизм хранения способен поддерживать большие строки. Столбцы BLOB и TEXT вносят только 9-12 байт в ограничение размера строки, поскольку их содержимое хранится отдельно от остальной части строки.

  • Максимальный размер строки для таблицы InnoDB, который применяется к данным, хранящимся локально на странице базы данных, составляет чуть меньше половины страницы. Например, максимальный размер строки немного меньше 8 КБ для размера страницы InnoDB по умолчанию 16 КБ, который определяется параметром конфигурации innodb_page_size. « Ограничения на таблицы InnoDB ».

  • Если строка, содержащая столбцы переменной длины, превышает максимальный размер строки InnoDB, InnoDB выбирает столбцы переменной длины для внешнего хранения вне страницы, пока строка не вписывается в ограничение размера строки InnoDB. Объем данных, хранящихся локально для столбцов переменной длины, которые хранятся вне страницы, зависит от формата строки. Для получения дополнительной информации см. « InnoDB Row Storage и Row форматы ».
  • Различные форматы хранения используют разные объемы заголовка страницы и данных трейлера, что влияет на объем хранения, доступный для строк.
Саурабх Чандра Патель
источник
1

Ссылка http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

Пределы размера строки

Максимальный размер строки для данной таблицы определяется несколькими факторами:

Максимальное значение размера строки во внутреннем представлении таблицы MySQL составляет 65 535 байт, даже если механизм хранения способен поддерживать большие строки. Столбцы BLOB и TEXT вносят только 9-12 байт в ограничение размера строки, поскольку их содержимое хранится отдельно от остальной части строки.

Максимальный размер строки для таблицы InnoDB, который применяется к данным, хранящимся локально на странице базы данных, составляет чуть меньше половины страницы для настроек 4nB, 8KB, 16KB и 32KB innodb_page_size. Например, максимальный размер строки составляет чуть менее 8 КБ для размера страницы InnoDB по умолчанию 16 КБ. Для страниц размером 64 КБ максимальный размер строки составляет чуть менее 16 КБ. См. Раздел 15.8.8, «Ограничения для таблиц InnoDB».

Если строка, содержащая столбцы переменной длины, превышает максимальный размер строки InnoDB, InnoDB выбирает столбцы переменной длины для внешнего хранения вне страницы, пока строка не вписывается в ограничение размера строки InnoDB. Объем данных, хранящихся локально для столбцов переменной длины, которые хранятся вне страницы, зависит от формата строки. Для получения дополнительной информации см. Раздел 15.11 «Хранение строк InnoDB и форматы строк».

Различные форматы хранения используют разные объемы заголовка страницы и данных трейлера, что влияет на объем хранения, доступный для строк.

Для получения информации о форматах строк InnoDB см. Раздел 15.11, «Хранение строк InnoDB и форматы строк», и Раздел 15.8.3, «Физическая структура строк таблиц InnoDB».

Для получения информации о форматах хранения MyISAM см. Раздел 16.2.3, «Форматы хранения таблиц MyISAM».

http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

МД Назрул Ислам
источник
-3

Там нет предела. Это зависит только от вашей свободной памяти и максимального размера файла системы. Но это не означает, что вы не должны принимать меры предосторожности при решении проблемы использования памяти в вашей базе данных. Всегда создавайте сценарий, который может удалять строки, которые не используются или которые будут содержать общее количество строк в пределах определенного числа, скажем тысячи.

9jamkt
источник
8
Удаление строк, которые вы считаете «вышедшими из употребления», опасно и вызывает гораздо больше проблем, чем решает. Предыдущий разработчик одного из моих проектов реализовал скрипт, который удалял корзины покупок старше трех дней, думая, что он поступает правильно. Угадайте, что это вызывает проблемы еженедельно. Удаляйте данные только в том случае, если это действительно необходимо.
Бен Хичкок
в худшем случае, когда кто-то начинает хранить пути к файлам в базе данных ... скажите, куда делись все файлы моего проекта .... у меня небольшой проект, начинающийся с файлов размером 3,5 млн. Угадайте, что ... они не все часто используется.
Кендрик