Как выбрать оптимизированные типы данных для столбцов [специфичные для innodb]? - PullRequest
16 голосов
/ 20 июля 2010

Я изучаю использование типов данных для баз данных.

Например:

  • Что лучше для электронной почты? varchar [100], char [100] или tinyint (шутка)
  • Что лучше для имени пользователя? я должен использовать int, bigint или varchar? Объясните. Некоторые из моих друзей говорят, что если мы используем int, bigint или другой числовой тип данных, это будет лучше (это делает Facebook). Например, u = 123400023 относится к пользователю 123400023, а не к user = thenameoftheuser. Поскольку для получения чисел требуется меньше времени.
  • Что лучше для телефонных номеров? Сообщения (как в блогах или объявлениях)? Или, может быть, даты (я использую дату и время для этого)? может быть, некоторые проводят исследования, которыми хотели бы поделиться.
  • Цена товара (я использую десятичную (11,2), не знаю, как вы, ребята)?
  • Или что-нибудь еще, что вы имеете в виду, например: «Я использую серийный тип данных для блаблабла».

Почему я специально упоминаю innodb?

Если вы не используете таблицу InnoDB типы (см. главу 11 «Расширенные MySQL, "для получения дополнительной информации), CHAR столбцы быстрее доступны, чем VARCHAR.

У Inno db есть некоторые различия, которых я не знаю. Я прочитал это с здесь .

Ответы [ 3 ]

15 голосов
/ 20 июля 2010

Краткое резюме:

(только мои мнения)

  1. для адреса электронной почты - VARCHAR(255)
  2. для имени пользователя - VARCHAR(100) или VARCHAR(255)
  3. для id_username - используйте INT (если в вашей системе не планируется более 2 миллиардов пользователей)
  4. номера телефонов - INT или VARCHAR или, может быть, CHAR (зависит от того, хотите ли вы сохранить форматирование)
  5. сообщений - TEXT
  6. даты - DATE или DATETIME (обязательно укажите время для таких вещей, как сообщения или электронные письма)
  7. деньги - DECIMAL(11,2)
  8. Разное - см. Ниже

Что касается использования InnoDB, поскольку VARCHAR должно быть быстрее, я бы не беспокоился об этом или о скорости в целом. Используйте InnoDB, потому что вам нужно выполнять транзакции и / или вы хотите использовать ограничения внешнего ключа (FK) для целостности данных. Кроме того, InnoDB использует блокировку на уровне строк, тогда как MyISAM использует только блокировку на уровне таблиц. Следовательно, InnoDB может обрабатывать более высокие уровни параллелизма лучше, чем MyISAM. Используйте MyISAM для использования полнотекстовых индексов и для несколько меньших накладных расходов.

Более важно для скорости, чем для типа двигателя: поместите указатели в столбцы, по которым вам нужно быстро искать. Всегда помещайте индексы в столбцы вашего ID / PK, такие как имя id_user, которое я упомянул.

Подробнее:

Вот несколько вопросов о типах данных MySQL и дизайне базы данных (предупреждение, больше, чем вы просили):

И пара вопросов о том, когда использовать движок InnoDB:

Я просто использую tinyint почти для всего (серьезно).

Правка - Как хранить "сообщения":

Ниже приведены некоторые ссылки с более подробной информацией, но вот краткая версия. Для хранения «сообщений» вам нужно место для длинной текстовой строки. CHAR максимальная длина равна 255, так что это не вариант, и, конечно, CHAR будет тратить неиспользуемые символы по сравнению с VARCHAR, который имеет переменную длину CHAR.

До MySQL 5.0.3 максимальная длина VARCHAR составляла 255, поэтому у вас останется TEXT. Однако в более новых версиях MySQL вы можете использовать VARCHAR или TEXT. Выбор сводится к предпочтению, но есть пара отличий. Максимальная длина VARCHAR и TEXT теперь составляет 65 535, но вы можете установить собственную максимальную длину на VARCHAR. Допустим, вы считаете, что ваши сообщения должны быть не более 2000, вы можете установить VARCHAR(2000). Если вы каждый раз сталкиваетесь с лимитом, вы можете ALTER поставить таблицу позже и увеличить ее до VARCHAR(3000). С другой стороны, TEXT фактически сохраняет свои данные в BLOB (1). Я слышал, что могут быть различия в производительности между VARCHAR и TEXT, но я не видел никаких доказательств, так что вы можете рассмотреть это подробнее, но вы всегда можете изменить эту незначительную деталь в будущем.

Что еще более важно, поиск в этом столбце "post" с использованием полнотекстового индекса вместо LIKE будет намного быстрее (2). Однако вы должны использовать движок MyISAM для использования полнотекстового индекса, потому что InnoDB не поддерживает его . В базе данных MySQL у вас может быть разнородное сочетание механизмов для каждой таблицы, поэтому вам просто нужно будет заставить свою таблицу «posts» использовать MyISAM. Однако, если вам абсолютно необходимы «сообщения» для использования InnoDB (для транзакций), установите триггер, чтобы обновить копию MyISAM вашей таблицы «сообщений» и использовать копию MyISAM для всех полнотекстовых поисков.

См. Внизу несколько полезных цитат.

(3) "Значения в столбцах VARCHAR являются строками переменной длины. Длина может быть указана в виде значения от 0до 255 до MySQL 5.0.3 и от 0 до 65 535 в 5.0.3 и более поздних версиях.

До MySQL 5.0.3, если вам нужен тип данных, для которого не удаляются конечные пробелы, рассмотрите возможность использования BLOBили тип TEXT.

Когда значения CHAR сохраняются, они дополняются справа пробелами до указанной длины. При получении значений CHAR конечные пробелы удаляются.

До MySQL 5.0.3конечные пробелы удаляются из значений, когда они сохраняются в столбце VARCHAR; это означает, что пробелы также отсутствуют в извлеченных значениях. "

Наконец, вот отличный пост о плюсахи минусы VARCHAR против текста.Это также говорит о проблеме производительности:

3 голосов
/ 20 июля 2010

Есть несколько точек зрения, чтобы подойти к вашему вопросу.

Из POV дизайна всегда лучше выбрать тип данных, который выражает количество, которое вы хотите моделировать лучше всего.То есть, правильно подберите область данных и размер данных, чтобы в первую очередь нельзя было сохранить недопустимые данные в базе данных.Но это не то, где MySQL является сильным в первую очередь, и особенно не с sql_mode по умолчанию (http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html). Если это работает для вас, попробуйте TRADITIONAL sql_mode, который является сокращением для многих желаемых флагов.

С точки зрения производительности POV вопрос совершенно иной. Например, в отношении хранения тел электронной почты вы можете прочитать http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/ и затем подумать об этом.

Удаление избыточностей иКороткие ключи могут быть большим выигрышем. Например, в проекте, который я видел, в таблице журналов хранится информация http-агента пользователя. Просто заменяя каждую строку агента пользователя в таблице журнала числовым идентификатором пользователя.Строка агента в таблице поиска, размер набора данных был значительно (более чем на 60%) уменьшен путем дальнейшего анализа пользовательского агента и последующего хранения набора идентификаторов (операционная система, тип браузера, индекс версии), размер набора данных был уменьшен до 1% от исходного размера.

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

Например, все, что имеет идентификатор в имени и не является целым типом без знака, вероятно, является ошибкой (особенно в контексте innodb).

Например, что-нибудьс указанием цены или стоимости в названии и без подписи является потенциальным источником мошенничества (мошенник создает товар с отрицательной ценой и покупает его).

Например, все, что работает с денежными данными и не используеттип данных DECIMAL соответствующего размера, вероятно, выполняет неправильные математические вычисления (DECIMAL выполняет математические операции с десятичными числами с правильной точностью и округлением, а DOUBLE и FLOAT - нет).

1 голос
/ 29 ноября 2013

SQLyog имеет Функция расчета оптимального типа данных , которая помогает найти оптимальный тип данных на основе записей, вставленных в таблицу. Использует

SELECT * FROM table_name` АНАЛИЗ ПРОЦЕДУРЫ (1, 10);

запрос для определения оптимального типа данных

...