2012-02-21 3 views
30

Я пытаюсь выяснить, будет ли моя таблица работать менее результативно, если я изменю первичный ключ на BIGINT (20). На данный момент я использую INT (7) и имею около 300 000 записей уже с большими идентификаторами (7 или 8 цифр). Я много искал, но только узнал, что он использует больше дискового пространства (что очевидно).BIGINT mysql производительность по сравнению с INT

Все мои идентификаторы имеют 7 цифр прямо сейчас, но мой клиент хочет изменить на 8 цифр. Я не буду в состоянии легко менять программное обеспечение в будущем, поэтому я подумал об использовании BIGINT (20) сейчас на всякий случай. Было бы хуже, если я использую BIGINT, хотя мне еще не нужно?

Кто-нибудь, у кого есть опыт, имеет предложения относительно скорости и производительности?

ответ

81

Чтобы ответить на ваш вопрос: да, он будет менее результативным. Очевидно, что чем больше тип, тем больше таблица, тем медленнее запросы (больше ввода-вывода, большие индексы, более длительное время доступа, менее вероятны для размещения в разных кешах и т. Д.). Итак, как правило: всегда используйте наименьший тип, который вам подходит.

Это считается, выступление не имеет значения. Зачем? Потому что, когда вы достигаете точки, где вы переполняете INT, тогда BIGINT - единственное решение, и вам придется жить с ним. Также в этот момент (учитывая, что вы используете автоматическое увеличение PK, вы будете превышать 4 миллиардов строк), у вас будут большие проблемы с производительностью, а накладные расходы BIGINT по сравнению с INT будут наименьшим из ваши проблемы.

Итак, рассмотрят следующие моменты:

  • Используйте UNSIGNED, если вам не нужны отрицательные значения, что удвоит предел.
  • Максимальное значение UNSIGNED INT составляет 4.294.967.295. Если вы используете автоинкремент PK и , у вас всего 300 000 записей, вам действительно не нужно беспокоиться. Вы могли бы даже использовать MEDIUMINT на данный момент, если только вы не планируете действительно быстрый рост. (см. http://dev.mysql.com/doc/refman/5.1/en/integer-types.html)
  • Число в скобках после типа не влияет на максимальное значение типа. INT (7) совпадает с INT (8) или INT (32). Он используется для указания максимальной ширины отображения. (см. http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html)
+3

Это говорит обо всем, что я собирался. У вас практически нет шансов превзойти лимит на поле INT, если вы не имеете дело с большим количеством данных (что 300 000 записей НЕ). Также, как упоминалось здесь, (7) действительно не делает ничего, чтобы ограничить то, что хранит поле. У вас все еще есть предел в 4,3 миллиарда (при условии, что вы его НЕ ЗНАЮ) –

+0

Я знаю о размерах int (7) и так далее. но я не использую auto-increment в этой таблице, потому что числа импортируются из другой базы данных, и они намного длиннее 2 символов. – rubo77

+0

Я читаю http://dev.mysql.com/doc/refman/5.1/en/numeric -type-overview.html :) – rubo77

Смежные вопросы