Максимальна кількість записів у таблиці бази даних MySQL


174

Яка верхня межа записів для таблиці баз даних MySQL. Мені цікаво про поліпшення автоматичного збільшення. Що буде, якщо додати мільйони записів? Як впоратися з подібними ситуаціями? Дякую!


16
Не кажучи вже про 1,21 GIGAWATTS!
Бен

2
Принаймні, якщо пам'ять служить, ліміт встановлюється механізмом зберігання даних, тому (наприклад, за допомогою MyISAM ви отримуєте інший ліміт від використання InnoDB.
Джері Коффін

77
@ Лук-лицар: Я не згоден. Це нормально вставляти мільйони рядків в одну таблицю, а деякі бази даних мають обмеження, тому варто запитати. Якщо запитати, чи підтримує MySQL мільйони таблиць, то це, мабуть, ознака помилки архітектури.
Білл Карвін

Відповіді:


61

Типи mysql int можуть виконати досить багато рядків: http://dev.mysql.com/doc/refman/5.0/uk/numeric-types.html

без знака по intвеличині значення 4,294,967,295
без знака bigintнайбільшого значення є18,446,744,073,709,551,615


8
2147483647 макс., Тож вам потрібно зробити автоматичне збільшення bigint лише якщо ви працюєте з кількома мільярдами записів? (що, мабуть, просто зробить ваші вибрані заяви танути задовго до цього часу)
Kzqai

2
@Tchalvak для підписаного int, прочитайте документацію mysql.
Леандро

8
У контексті запитання йдеться про те, чи поле автоматичного збільшення може обробляти багато рядків, а не обмеження інших ресурсів
KM.

21
Плакат не запитує про числові чи будь-які інші типи даних. . Я дійсно не розумію, як це можна позначити як правильну відповідь. Хоча я мушу визнати, що питання неоднозначне, ми повинні розрізняти тип даних ПК і максимальну кількість рядків для таблиці.
Бері

1
@Bery, ОР визначила те, що вони мали після, вибравши це як свою відповідь. Мабуть, їх цікавила ємність поля автоматичного збільшення, яке охоплює моя відповідь, а не обмеження інших ресурсів.
КМ.

238

Найбільше значення цілого числа мало пов'язане з максимальною кількістю рядків, які ви можете зберігати в таблиці.

Це правда, що якщо ви використовуєте int або bigint в якості основного ключа, ви можете мати стільки рядків, скільки кількість унікальних значень у типі даних вашого первинного ключа, але вам не потрібно робити основний ключ цілим числом , ви можете зробити це ЧАР (100). Ви також можете оголосити первинний ключ у кількох стовпцях.

Існують і інші обмеження щодо розміру таблиці, окрім кількості рядків. Наприклад, ви можете використовувати операційну систему з обмеженням розміру файлу. Або у вас може бути жорсткий диск на 300 Гб, який може зберігати лише 300 мільйонів рядків, якщо кожен рядок розміром 1 КБ.

Обмеження розміру бази даних дійсно високі:

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

Система зберігання даних MyISAM підтримує 2 32 рядки на таблицю, але ви можете створити MySQL з --with-big-tablesможливістю підтримувати її до 2 64 рядків на таблицю.

http://dev.mysql.com/doc/refman/5.1/uk/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, пошук сфінксів зазвичай є кращим вибором, ніж повнотекстові індекси в MyISAM або InnoDB.
Білл Карвін

1
Для mysql 8 ліміт - 256 ТБ з розміром сторінки 64 Кб.
UselesssCat

13

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

Коли ви зіткнетеся з багатьма рядками таблиці, тоді вам слід почати чіткішати таблиці або розділення і вводити старі дані в старі таблиці за роками, наприклад користувачі_2011_jan, users_2011_feb або використовувати номери за місяць. Потім змініть програмування для роботи з цією моделлю. Можливо, складіть нову таблицю з меншою кількістю інформації, щоб узагальнити дані в менших стовпцях, а потім зверніться до таблиць з більшими розмірами лише тоді, коли вам потрібно більше інформації, наприклад, коли користувач переглядає їх профіль. Все це слід розглядати дуже ретельно, тому надалі його не дуже дорого переосмислювати. Ви також можете розміщувати в одній таблиці лише тих користувачів, які весь час відвідують ваш сайт, та користувачів, які ніколи не заходять в архівований набір таблиць.


1
У зв'язку з цим дуже корисно подивитися на розділ MySQL: dev.mysql.com/doc/refman/5.6/en/partitioning.html
Wim Deblauwe

10

У InnoDB з обмеженням розміру таблиці 64 терабайт та обмеженням розміру рядків MySQL 65,535 може бути 1,073,741,824 рядків. Це буде мінімальна кількість записів, що використовують максимальний розмір рядка. Однак можна додати більше записів, якщо розмір рядка менший.


для зберігання цієї кількості (1,073,741,824) рядків з обмеженням рядків 65535, скільки потрібен розмір жорсткого диска? будь ласка, запропонуйте
davidb

1
Необхідний розмір жорсткого диска неможливо визначити, виходячи лише з кількості рядків та розміру рядка. Сам розмір таблиці складе 64 терабайти. Однак дані стовпців TEXT та BLOB зберігаються окремо від рядка та потребуватиме додаткового місця. Крім того, це залежатиме від кількості та типу стовпців TEXT та BLOB, оскільки розмір змінюється залежно від типу. Існує чотири типи текстових стовпців, а саме: TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT. Існують також чотири типи стовпців BLOB, а саме: TINYBLOB, MEDIUMBLOB, BLOB та LONGBLOB.
Xylo

2

Відповідно до розділу масштабованості та обмежень у http://dev.mysql.com/doc/refman/5.6/uk/features.html , підтримка MySQL для великих баз даних. Вони використовують MySQL Server із базами даних, що містять 50 мільйонів записів. Деякі користувачі використовують MySQL Server з 200 000 таблиць і близько 5 000 000 000 рядків.


це може допомогти, якщо ви також повідомте нам про те, яке технічне обладнання "Вони" використовували
мій рахунок_ram

Дійсно, ти маєш рацію. Але, на жаль, "вони" нічого не мали про апаратне забезпечення
дані

@myaccount_ram пробачте, що це неромантизує, але якщо це корисно, я побачив менш теоретичні, більш практичні межі виробництва MySQL в дії. Я бачив базу даних, що становить ~ 18 мільярдів рядків у 2х db.r4.16xlarge екземплярах AWS (1 читач, 1 автор). Кожна з машин мала 64 ядра процесора, 488 ГБ оперативної пам’яті, мережеве посилання 25 Гбіт / с, 64 ТБ диска. Цей масштаб db підштовхував і обмеження розміру процесора та диска, і AWS не забезпечує більших екземплярів, оптимізованих для БД. Його було замінено на більш просту схему db, яка не потребувала стільки рядків.
Skylar Brown

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 ".
  • У різних форматах зберігання використовуються різні кількості заголовків сторінки та даних трейлера, що впливає на обсяг пам’яті, доступний для рядків.

1

Посилання http://dev.mysql.com/doc/refman/5.7/uk/column-count-limit.html

Обмеження розміру рядків

Максимальний розмір рядка для даної таблиці визначається декількома факторами:

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

Максимальний розмір рядка для таблиці InnoDB, який застосовується до даних, що зберігаються локально на сторінці бази даних, становить трохи менше половини сторінки для параметрів innodb_page_size розміром 4 КБ, 8 КБ, 16 КБ та 32 КБ. Наприклад, максимальний розмір рядка трохи менше 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/uk/innodb-restrictions.html


-3

Межі немає. Це залежить лише від вашої вільної пам'яті та максимального розміру файлу системи. Але це не означає, що ви не повинні вживати запобіжних заходів щодо вирішення питань використання пам'яті у вашій базі даних. Завжди створюйте скрипт, який може видаляти рядки, які не використовуються, або які містять загальну кількість рядків у певній фігурі, скажімо, тисяча.


8
Видалення рядків, які, на вашу думку, "не використовуються" є небезпечним і спричиняє набагато більше проблем, ніж вирішує. Попередній розробник одного з моїх проектів реалізував сценарій, який видаляв кошики віком більше трьох днів, думаючи, що він робить правильно. Здогадайтесь, що викликає проблеми щотижня. Видаляйте дані лише в тому випадку, якщо вам це потрібно.
Бен Хічкок

гірший випадок - коли хтось починає зберігати шляхи до файлів у базі даних ... сіно, куди пішли всі мої файли проекту .... У мене є невеликий проект, який починається з 3.5M файлів здогадуйтесь, що ... вони не всі використовується часто.
Кендрік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.