Индекс или уникальный? Что лучше MySql

Итак, у меня есть вопрос.

Скажите, что у вас есть запросы таблицы, которые представляют собой график. В таблице запроса есть 3 столбца, A, B, время. A → B В момент времени. Таким образом, каждая строка представляет собой направленное соединение от A (запросчика) к B (запрашивающему лицу) в момент времени T (время только для организации данных, а не для чего-либо еще).

Итак, что быстрее, если сказать, что запросы были 1 000 000 строк.
Индекс (A, B) Индекс (A) и индекс (B) Уникальный (A, B)?

Спасибо, ребята! И A, B - VARCHAR (32) (MD5)

Извините, я забыл типичный запрос.
Мне нужно узнать, есть ли у пользователя А (который вошел в систему) какие-либо запросы!
Мне также потребуется выполнить поиск, чтобы убедиться, что пользователь принял правильный запрос, A принимает B.

Таким образом, выражения будут выглядеть.

Любые новые запросы?

SELECT B, time
FROM requests
WHERE A='$id';  

Есть ли запрос A от B?

SELECT time
FROM requests
WHERE A='$A' and B='$B';

Ответ 1

В этом конкретном случае используйте комбинированный индекс, включающий A и B. Убедитесь, что A является первым в индексе. Таким образом, когда вы запускаете эти два запроса, индекс будет использоваться для обоих.

Подробнее о составных индексах:

http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html

Кроме того, уникальность (A, B) не имеет значения, если вы не хотите, чтобы B мог запросить A не более один раз.

Ответ 2

Индекс и уникальность - это два совершенно разных понятия.

Индексы
Индекс - это скрытый дополнительный столбец, содержащий те же данные, которые отсортированы с указателем на ваши реальные данные. Используя индекс, вы можете

  • Быстрый поиск определенного элемента
  • Быстро найти диапазон элементов (между x и y)
  • Сэкономьте время при использовании order by, потому что элементы отредактированы
  • Экономия времени при использовании group by, потому что группа должна соответствовать идентичным элементам

Это нормальный индекс, он не учитывает повторяющиеся значения, за исключением первичного ключа, который всегда уникален.

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

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

Однако индексы ускоряют select много, много.
unique не ускоряет все, что позволяет убедиться, что вы случайно не вставляете повторяющуюся строку.

Когда использовать индексы, а не
Не помещайте индекс в каждое поле. Как указано выше, это замедлит вас insert и update вниз.
Всегда указывайте критерии включения. И серьезно подумайте о том, чтобы разместить индекс в столбце, который вы используете в предложениях where много.
MySQL откажется использовать индекс, если 50% ваших строк имеют одинаковое значение в поле, поэтому забудьте об индексах в логических (Y/N) полях, в 99% случаев, когда они не будут работать.
(Индексы в полях с низкой мощностью не полезны)

Всегда назначать первичный ключ
Однако всегда назначайте первичный ключ в таблице. Предпочтительно тип integer autoincrement. Если вы не назначаете первичный ключ, MySQL назначит вам "скрытый" первичный ключ (тип автоинкремента целочисленного типа), но вы не сможете использовать скрытый ПК для ускорения кавычек или определения ваших строк и есть множество других медлительных проблем со скрытым ПК, которые заставляют их сосать очень плохо.

Надеюсь, что это поможет.

Ссылки:
Как MySQL использует индексы: http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html
Когда использовать индексы: http://www.howtoforge.com/when-to-use-indexes-in-mysql-databases
Более того: http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm
Наконец, я буду скрываться здесь, если вы хотите узнать больше о MySQL: http://planet.mysql.com/