Чи робить поле унікальним, робить його індексованим?


10

Якщо я uniqueобмежую поле, чи потрібно мені також робити індекс на цьому полі, щоб отримати масштабований час вставки? Або це зроблено для мене (навіть якщо індекс, який він використовує, не є загальнодоступним?)

Зокрема, я працюю з Apache Derby для складання прототипів, хоча я, ймовірно, перенесу його на MySQL у напів найближчому майбутньому. Я також сподіваюся, що в стандарті SQL може бути щось, що щось говорить про це.

У мене ніколи не буде потреби в пошуку за цим полем, тому я краще не буду робити марний індекс. Але я б скоріше мав марний індекс, ніж мав час O(n)вставки.


2
З того, що мені відомо, за допомогою унікального індексу реалізується унікальне обмеження. Ви можете побачити деякі думки щодо цієї ситуації в цьому запитанні: коли використовувати унікальне обмеження замість унікального індексу?
Маріан

@Marian дякую за це посилання. Це було дуже проникливо.
corsiKa

Відповіді:


2

--EDIT--

Моя оригінальна відповідь (нижче), напевно, вам зовсім не корисна, оскільки вона не стосується питання uniqueобмежень. Як зазначають інші, ці обмеження зазвичай реалізуються з маючи на увазі унікальний індекс. В окремих випадках це може бути неправдою (наприклад, disable novalidateдля Oracle).

Питання може бути таким: чи можливо набути унікальності без індексу? Взагалі відповідь - ні, хоча в деяких випадках індекс кластера означатиме, що індекс і таблиця є одним і тим же об'єктом.

--END EDIT--

Ви сказали: "Я б швидше мав непотрібний індекс, ніж мав час вставки O (n).", Але загалом у базах даних немає часу на введення O (n). Слід розглянути два випадки:

  1. Нормальна таблиця з індексами або без них:

    Нові ряди скидаються у верхній частині купи. RDBMS, ймовірно, дивиться лише на 1 блок, тому не просто O (1), але дуже малий O (1).

    Якщо таблиця має індекси, до кожного додається покажчик на рядок. Зазвичай це операція O (log (n)).

  2. Таблиця з тим, що відбувається якесь кластеризація, наприклад, організована таблиця або кластер для Oracle або кластерний індекс для SQL Server та інші:

    Нові рядки вставляються в певний блок, що може спричинити розбиття або переповнення блоку, але що б не сталося, це все-таки O (log (n)) або краще , викликане b-деревом або подібною структурою, що використовується для пошуку блоку.


Але унікальність без індексу була б O(n)такою, якою ви повинні перевірити всю таблицю. Ось чого я намагаюся уникати.
corsiKa

Це справді найкраща відповідь на це питання !!! +1
RolandoMySQLDBA

@Trick - так, я спочатку неправильно зрозумів. Індекс - це ціна, яку ви платите за обмеження унікальності, якого я боюся. Чи можете ви використовувати індекс кластера у вашому випадку?
Джек каже, спробуйте topanswers.xyz

1
@JackPDougless Я можу використовувати стандартний "індекс" і отримати час O(lg n)вставки. Це не проблема. Моє запитання: чи система, знаючи, що вам потрібен цей індекс, щоб отримати гідний час вставки, створила для мене індекс.
corsiKa

2

ПЕРШИЙ КЛЮЧ> = УНІКАЛЬНИЙ = = ІНДЕКС == КЛЮЧ

Дані InnoDB упорядковуються ПК. MyISAM PK діє так само, як УНІКАЛЬНО.

INSERT повинен додати "рядок" до кожного індексу (будь-якого виду), який у вас є. Це займає деякий час. (Зазвичай на питання не вистачає часу.) Індекси зберігаються у форматі BTree. Блоки MyISAM BTree - 1 КБ; InnoDB використовує 16 КБ.

Вставлення в InnoDB оновлює ПК та дані одночасно.

Вставлення в MyISAM зазвичай "додає" дані до .MYD. Окремо він додає рядок до ПК (якщо такий є).

INSERT спочатку повинен переконатися, що немає жодного повторюваного ключа для жодного ПРИМІТНОГО або УНІКАЛЬНОГО ключа. Це робиться за допомогою індексу. І, отже, чому УНІКАЛЬНІ та ЗОВНІШНІ КЛЮЧОВІ ВИСНОВКИ дійсно будують індекси. Це O (logN), але зазвичай процесор, а не введення / виведення, тому що якщо ефективне кешування.


Чи є у вас цитування в специфікації InnoDB, яка заявляє про UNIQUEобмеження, створить індекс без того, щоб користувач вказав, який повинен бути зроблений?
corsiKa

Гммм ... Ні, лише роки досвіду.
Рік Джеймс

І ось спосіб перевірити це ... СТВОРИТИ таблицю без вторинних індексів; ЗРОБИТИ СТАТУТ ТАБЛИЦІ - довжина індексу буде дорівнює 0. Потім додайте УНІКАЛЬНИЙ індекс; СТАТУТ ТАБЛИЦІ зараз щось покаже. (Можливо, доведеться внести нетривіальну кількість даних у таблицю.)
Рік Джеймс

1

Щоб відповісти на запитання жирним шрифтом: Так, створення поля унікальним робить його індексом як первинний ключ. Насправді я обговорював це в іншому запитанні стосовно первинних ключів, які мають власну назву, щоб відрізнити його від інших унікальних (кандидатських) ключів .

Що стосується обмежень, то для вас створюються індекси, щоб встановити парадигму обмежень. Ви повинні мати змогу видаляти повторювані індекси, навіть UNIQUE ключі до тих пір, поки створене вами обмеження не посилається на інші Унікальні ключі, які ви особисто створили, окрім парадигми обмеження.

Можливо, вам ніколи не доведеться шукати це поле, але MySQL обов'язково повинен буде визначити дійсність ключів і визначити, як слід виконувати операції ON DELETE CASCADE і ON UPDATE CASCADE.

Індекс UNIQUE просто гарантує унікальність кортежів (одиночні кнопки, пари, трійки, ..., n-кортежі тощо) у кожному рядку таблиці.

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


1
Це не відповідає на моє запитання. Моє запитання пов'язане з часом вставки. Якщо у вас є унікальне обмеження, система повинна забезпечити унікальність поля перед вставкою - якщо на полі немає індексу, доведеться шукати всю таблицю ( O(n)). Якщо є індекс, пошук буде набагато швидшим (ймовірно O(lg n)). Це моє питання. Я добре знаю референтну механіку цілісності, мене хвилюють лише (для цілей цього питання) продуктивність.
corsiKa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.