Краткое резюме:
(только мои мнения)
- для адреса электронной почты -
VARCHAR(255)
- для имени пользователя -
VARCHAR(100)
или VARCHAR(255)
- для id_username - используйте
INT
(если в вашей системе не планируется более 2 миллиардов пользователей)
- номера телефонов -
INT
или VARCHAR
или, может быть, CHAR
(зависит от того, хотите ли вы сохранить форматирование)
- сообщений -
TEXT
- даты -
DATE
или DATETIME
(обязательно укажите время для таких вещей, как сообщения или электронные письма)
- деньги -
DECIMAL(11,2)
- Разное - см. Ниже
Что касается использования 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 против текста.Это также говорит о проблеме производительности: