производительность: mysql и соединения

это просто вопрос о моделировании таблиц.

у меня есть таблица пользователей, например:

  • имя пользователя varchar ОСНОВНОЙ
  • пароль varchar
  • имя варчар
  • фамилия варчар
  • ...

затем есть некоторые таблицы, которые ссылаются на пользователя, такие как таблицы групп и журналов...

теперь я думаю о добавлении id в качестве целого числа без знака с автоматическим добавлением в пользовательскую таблицу. потому что кто-то сказал мне, что соединения над целыми числами быстрее, чем соединения над varchars.

Для меня это звучит разумно, потому что нужно сравнивать меньше байтов.

Это правда? Или вы скажете, что нет необходимости вводить столбец id в пользовательскую таблицу?

Заранее большое спасибо :)


person JMW    schedule 26.12.2010    source источник
comment
связанный stackoverflow.com/questions/164991/   -  person Haim Evgi    schedule 26.12.2010


Ответы (2)


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

Если у вас есть стабильный (то есть он НИКОГДА не случается) естественный ключ, вы получаете одно существенное преимущество в производительности. Часто вы можете полностью удалить соединение с пользовательской таблицей, поскольку вы можете напрямую запрашивать другие таблицы, например:

select ...
  from user_posts 
 where userid = 'JMW'

Что касается обсуждения INT/VARCHAR, вот статья, которая может вас заинтересовать.

http://www.mysqlperformanceblog.com/2008/01/24/enum-fields-vs-varchar-vs-int-joined-table-what-is-faster/

person Ronnis    schedule 26.12.2010

MySQL, в зависимости от используемого вами движка, может быть ужасно медленным при использовании индексов varchar, особенно InnoDB. MyISAM будет довольно быстрым, но он не совместим с ACID, поэтому вам следует отказаться от него.

Обычно это верно для всех СУБД, целые числа всегда быстрее, чем строки (вы сравниваете их, используя арифметические сверхбыстрые операции ЦП вместо сравнения строк char с char).

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

РЕДАКТИРОВАТЬ: На практике большинство СУБД оптимизируют индексы varchar для чтения, InnoDB использует BTREE и хешированные строки, что делает его довольно быстрым в операциях чтения. InnoDB все еще страдает от медленной записи индексов varchar, я не могу найти связанные ошибки, но они все еще существуют как открытые ошибки MySQL в официальном трекере ошибок MySQL. Всегда аннулируйте индексы varchar, когда планируете использовать InnoDB.

person Pierre    schedule 26.12.2010