MySQL. Для всего INT?

12
O
На сайте с 29.05.2008
Offline
195
1204

Здравствуйте.

Скажу честно, используя MySQL регулярно, его изучение я обошел стороной. Когда я читал о типах данных, для себя решил, что буду использовать для всех чисел INT, для всех кратких надписей VARCHAR, для всех длинных тестов TEXT.

Мне интересно, как это сказывается на производительности. По сути, да, больше ОЗУ нужно для кеша. Но влияет ли это на производительность? Если формально для типа INT резервируются 4 кбайта памяти, сколько данных пересылается по протоколу TCP? 4 кбайт (с кучей нулей) или реальный размер поля?

Уточняете ли вы размер числа (TINY, SMALL, MEDIUM) в своих проектах? Для чего вы это делаете?

Какие минусы обычного INT, какие минусы строгой типизации?

Мысли вслух. По сути. У меня много ОЗУ (подходит INT). Мне не нужна совместимость с другими SQL СУБД (MS, Postgre) (подходит TINY, SMALL, ...). Но я хочу правильно, хочу точно. Вообще, я склоняюсь к строгой типизации в SQL, но ... следовательно нужно добавлять оную и в клиент. Так вот например, если я задал для автоинкремента тип SMALLINT, а он у меня уже заполнился, я должен убедиться в том что у меня есть свободные ячейки, перед тем как дать возможность добавить новую запись через WEB интерфейс.

Как типизируете данные ячеек в СУБД вы?

INT, TEXT, ...
25% (2)
INT(5), TEXT(65000), ...
25% (2)
TINYINT, SMALLINT, MEDIUMINT, INT, TEXT, FULLTEXT, BLOB, ...
50% (4)
Всего проголосовало: 8
R
На сайте с 18.12.2009
Offline
92
#1

Минусы обычного INT, когда Вам в базе нужно хранить булевое значение в том, что INT выжирает больше памяти. Используйте, например, tinyint(1) и так далее.

Тут нужно отталкиваться конкретно от задачи.

siv1987
На сайте с 02.04.2009
Offline
427
#2
IL
На сайте с 20.04.2007
Offline
435
#3
ortegas:
для типа INT резервируются 4 к байта памяти

Откуда информация?

ortegas:
я должен убедиться в том что у меня есть свободные ячейки, перед тем как дать возможность добавить новую запись через WEB интерфейс.

Валидация должна быть в любом случае. о_О

Строго говоря, и в случае с INT возможно переполнение.

Формально, использование Unsigned tinyInt вместо Int даёт экономию в 3 байта на запись, но потенциальную возможность быстрого заполнения автоинкремента.

Если в таблице не планируется много записей - можно "экономить", однако, "в случае чего" очень бредово отлавливать "тихую" ошибку переполнения (в зависимости от драйвера MySQL может вместо отправленного большого значения записать максимально допустимое для поля значение)...

ortegas:
для всех длинных тестов TEXT.

Для некоторых текстов маловато - LONGTEXT / MEDIUMTEXT может потребоваться..

CHAR иногда может иметь преимущество перед VARCHAR (заранее известная длина строки -> позиционирование курсора)

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
SI
На сайте с 03.12.2007
Offline
130
#4

> Если формально для типа INT резервируются 4 кбайта памяти, сколько данных пересылается по протоколу TCP? 4 кбайт (с кучей нулей) или реальный размер поля?

INT - 4 байта.

-= Онлайн сервисы =-
O
На сайте с 29.05.2008
Offline
195
#5
Sigmo#ID:
INT - 4 байта.

Ой да, извините, это опечатка.

CHAR иногда может иметь преимущество перед VARCHAR (заранее известная длина строки -> позиционирование курсора)

А ведь и правда. Спасибо.


---------- Добавлено 08.07.2013 в 22:50 ----------

rerighter:
Тут нужно отталкиваться конкретно от задачи.

Ну вопрос в том, а стоит ли? Мне не жалко ОЗУ, мне жалко времени. Это ведь как-то потенциально может влиять на производительность? 4 байта на INT, а пакет содержит в себе статически 4 байта, или пакет данных занимает ровно столько сколько нужно, без заполнения нулем?

IL
На сайте с 20.04.2007
Offline
435
#6
ortegas:
Мне не жалко ОЗУ, мне жалко времени.

Не буду оригинальничать.. в очередной раз предложу прогнать бенчи..

:)

Причём, для тестируемых типов с использованием индексов и без них..

Было бы неплохо сохранить SQL на случай, если возникнет желание воспроизвести на другом сервере, поиграться с настройками, добавить тестов.

В таком виде, например... или в более "дружелюбном".

O
На сайте с 29.05.2008
Offline
195
#7
Минусы обычного INT, когда Вам в базе нужно хранить булевое значение в том, что INT выжирает больше памяти. Используйте, например, tinyint(1) и так далее.

А я храню в ENUM(0, 1). Так плохо?

bay_ebook
На сайте с 28.05.2010
Offline
111
#8
ortegas:
А я храню в ENUM(0, 1). Так плохо?

В производительности и ОЗУ не потеряете ничего. Разница только одна - на случай каких-либо математических функций tinyint предпочтительнее.

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
doctorpc
На сайте с 12.07.2009
Offline
112
#9

Однозначно третий вариант. Под каждую задачу свой тип.

При больших объемах занимаемое данными место и, главное, скорость работы может очень отличаться в зависимости от выбора типа. Мой подход противоположен подходу "памяти не жалко". Всегда считал, что в первую очередь нужно оптимизировать архитектуру/код, а уже потом добавлять железо.

V
На сайте с 05.08.2007
Offline
87
#10
ortegas:
Если формально для типа INT резервируются 4 кбайта памяти, сколько данных пересылается по протоколу TCP? 4 кбайт (с кучей нулей) или реальный размер поля?

Тут еще один момент: использование tcp при работе через порт - сразу минус около 10% производительности по сравнению с работой через сокет.

---

Виктор

С уважением, Victor (http://adm-lib.ru)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий