производительность: mysql и присоединяется - PullRequest
0 голосов
/ 26 декабря 2010

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

У меня есть пользовательская таблица типа:

  • username varchar PRIMARY
  • пароль varchar
  • имя varchar
  • фамилия varchar
  • ...

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 декабря 2010

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

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

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/

2 голосов
/ 26 декабря 2010

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

Это, как правило, справедливо для всех СУБД, целые числа всегда быстрее строк (вы сравниваете их с помощью artithmetical über быстрых операций ЦП вместо сравнения строк char с char).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...