Индекс или Уникальный?Что лучше MySql - PullRequest
16 голосов
/ 01 июня 2011

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

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

Так что же быстрее, если, скажем, запросы были 1 000 000 строк.
Индекс (A, B) Индекс (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 ]

38 голосов
/ 02 июня 2011

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

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

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

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

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

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

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

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

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

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

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

3 голосов
/ 01 июня 2011

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

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

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

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

...