индексы в MySQL 5.0 - уникальный против неуникальные
в чем разница между уникальным и неуникальным индексом mysql с точки зрения производительности? Допустим, я хочу сделать индекс на комбинации из 2 столбцов, и комбинация уникальна, но я создаю не уникальный индекс. Будет ли это иметь какое-либо существенное влияние на производительность или память, которую использует mysql? Тот же вопрос, есть ли разница между первичным ключом и уникальным индексом.
2 ответа:
уникальный и первичный ключограничения, не индексирует. Хотя большинство баз данных реализуют эти ограничения с помощью индекса. Дополнительные накладные расходы ограничения в дополнение к индексу незначительны, особенно при подсчете затрат на отслеживание и исправление непреднамеренных дубликатов, когда (не если) они происходят.
индексы обычно более эффективны, если у вас есть высокий селективность. Это отношение количества различные значения для общего числа строк.
например, в столбце для номера социального страхования может быть 1 миллион строк с 1 миллионом различных значений. Таким образом, селективность составляет 1000000/1000000 = 1.0 (хотя есть редкие исторические исключения, SSN предназначены для уникальности).
но другой столбец в этой таблице, "пол" может иметь только два различных значения более 1 млн. строк. 2/1000000 = очень низкая селективность.
индекс с уникальным или Ограничение первичного ключа гарантированно имеет селективность 1,0, поэтому оно всегда будет настолько эффективным, насколько может быть индекс.
вы спросили о разнице между первичным ключом и уникально ограничения. Главным образом, это то, что вы можете иметь только одно ограничение первичного ключа на таблицу (даже если определение этого ограничения включает несколько столбцов), тогда как вы можете иметь несколько уникальных ограничений. Столбец с уникальным ограничением может разрешать значения null, тогда как столбцы в первичном ключе ограничения не должны допускать нулей. В остальном первичный ключ и уникальный очень похожи по своей реализации и использованию.
вы спросили в комментарии о том, следует ли использовать MyISAM или InnoDB. В MySQL, они используют термин системы хранения данных. Есть куча тонких различий между этими двумя механизмами хранения, но главные из них:
- InnoDB поддерживает транзакции, поэтому вы можете выбрать откат или фиксацию изменений. MyISAM эффективно всегда автофиксации.
- InnoDB применяет ограничения внешнего ключа. MyISAM не применяет и даже не хранит ограничения внешнего ключа.
Если эти функции являются вещи, которые вам нужны в вашем приложении, то вы должны использовать InnoDB.
чтобы ответить на ваш комментарий, это не так просто. InnoDB на самом деле быстрее, чем MyISAM в довольно многих случаях, поэтому это зависит от того, что ваше приложение выбирает, обновляет, параллельные запросы, индексы, буфер конфигурация, etc.
см http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ для очень тщательного сравнения производительности двигателей хранения. InnoDB побеждает MyISAM достаточно часто, что явно невозможно сказать, что один быстрее другого.
Как и в большинстве вопросов, связанных с производительностью, единственный способ ответить на него приложения это проверить обе конфигурации с помощью вашего применение и репрезентативная выборка данных, и измерение результатов.
по неуникальному индексу, который просто является уникальным и уникальным индексом? Я не уверен, но думаю, что не очень много. Оптимизатор должен изучить мощность индекса и использовать его (это всегда будет число строк для уникального индекса).
Что касается первичного ключа, вероятно, довольно много, но это зависит от того, какой двигатель вы используете.
двигатель InnoDB (который используется многими людьми) всегда кластеризует строки на первичном ключе. Это означает, что ПК по существу в сочетании с фактическими данными строки. Если вы делаете много поисков с помощью PK (или действительно, сканирование диапазона и т. д.), Это хорошо, потому что это означает, что ему не нужно будет извлекать столько блоков с диска.
не-PK уникальный индекс никогда не будет кластеризован в InnoDB.
с другой стороны, некоторые другие движки (в частности, MyISAM) не кластеризуют PK, поэтому первичный ключ похож на обычный уникальный индекс.