UTWÓRZ INDEKS vs ALTER TABELA DODAJ INDEKS - MySQLism czy SQL Standard?

28

Właśnie natknąłem się na dziwny problem, w którym w zależności od sposobu utworzenia indeksu wymagana jest nazwa indeksu.

http://dev.mysql.com/doc/refman/5.5/en/create-index.html

http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name

ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name

Wydaje mi się, że wywołanie CREATE INDEX nie powinno wymagać podania nazwy indeksu. Zastanawiam się, czy jest to MySQLism, czy standard SQL?

Mike Purcell
źródło

Odpowiedzi:

25

Nie sądzę, że standard SQL w ogóle definiuje sposób tworzenia indeksów .

Cytat z tej strony Wikipedii :

Normalizacja

Nie ma standardu dotyczącego tworzenia indeksów, ponieważ standard ISO SQL nie obejmuje aspektów fizycznych. Indeksy to jedna z fizycznych części koncepcji bazy danych, między innymi pamięć (obszar tabel lub aplikacjami). Wszyscy dostawcy RDBMS udostępniają składnię CREATE INDEX z pewnymi konkretnymi opcjami, które zależą od funkcjonalności, które zapewniają klientom.

Wydaje się, że instrukcja Postgres obsługuje to tutaj:

Nie ma rezerw na indeksy w standardzie SQL.

Więcej dowodów na to powiązane pytanie dotyczące SO.

Erwin Brandstetter
źródło
6
MySQL to jedyny znany mi DBMS, który pozwala na dodanie jawnego indeksu ALTER TABLE(istnieją pewne przypadki, w których różne DBMS utworzą indeksy niejawne w celu obsługi ograniczeń, ale nie o to mi chodzi).
a_horse_w_no_name
@a_horse_with_no_name: Należy zauważyć. Nie rozumiem, dlaczego MySQL zmusza nas do przekazania nazwy_indeksu, skoro wyraźnie nie obsługuje żadnej nazwy pod spodem. PITA musi być zmuszona do zmiany po prostu w celu uniknięcia indeksowania nazw.
Mike Purcell,
-1

Jeśli nie podasz nazwy indeksu, MySQL automatycznie nada mu nazwę.

ALTER TABLE my_table ADD INDEX (col1);
ALTER TABLE my_table ADD INDEX (col1, col2);
ALTER TABLE my_table ADD INDEX (col2);

SHOW INDEX FROM my_table;

Powyższe ALTER TABLE ADD INDEXinstrukcje wygenerują następujące indeksy:

  • col1
  • col1_2
  • col2

Jeśli utworzysz indeks tylko z jedną kolumną, może nie być konieczne podanie nazwy indeksu (ponieważ nazwa indeksu będzie taka sama jak nazwa kolumny). Ale jeśli utworzysz indeks z wieloma kolumnami, lepiej podać nazwę indeksu, aby łatwiej było go zidentyfikować.

Dobrą praktyką jest podanie nazwy indeksu (i prefiks idxlub identyfikacja indeksu):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
kimbaudi
źródło