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

у меня есть вопрос.

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

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

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

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

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

новые запросы?

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

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

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

2 ответов


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

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

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

кроме того, уникальность (A, B) не должна иметь значения, если ваше требование заключается в том, что B может запросить только a максимум раз.


Index и unique-это две совершенно разные концепции.

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

  1. быстро найти конкретный пункт
  2. быстро найти ряд элементов (между x и y)
  3. экономия времени при использовании order by потому что элементы сортируются
  4. сохранить время при использовании group by потому что group by должен соответствовать идентичным элементам

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

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

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

однако индексы скорости select много, много.
Unique не ускоряет ничего, что гарантирует, что вы случайно не вставите дубликат ряд.

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

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

надеюсь, что это помогает.

ссылки:
Как 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/