MySQL
Индексы и ключи
Поиск…
Синтаксис
- Создать простой индекс
CREATE INDEX index_name ON table_name ( column_name1 [, column_name2 , ...])
- Создать уникальный индекс
CREATE UNIQUE INDEX index_name ON table_name ( column_name1 [, column_name2 , ...]
- Индекс падения
DROP INDEX index_name ON tbl_name [ algorithm_option | lock_option ] ...
algorithm_option: ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option: LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
замечания
Концепции
Индекс в таблице MySQL работает как индекс в книге.
Допустим, у вас есть книга о базах данных, и вы хотите найти некоторую информацию о хранилище. Без индекса (без какой-либо другой помощи, такой как оглавление) вам придется проходить страницы один за другим, пока не найдете тему (это «полное сканирование таблицы»). С другой стороны, индекс имеет список ключевых слов, поэтому вы проконсультируетесь с индексом и увидите, что хранилище упомянуто на страницах 113-120, 231 и 354. Затем вы можете напрямую переходить на эти страницы без поиска (это поиск с индексом, несколько быстрее).
Конечно, полезность индекса зависит от многих вещей - несколько примеров, используя сравнение выше:
- Если у вас есть книга о базах данных и индексировано слово «база данных», вы можете увидеть, что это упоминается на страницах 1-59, 61-290 и 292-400. Это много страниц, и в таком случае индекс не очень помогает, и, возможно, быстрее будет проходить страницы один за другим. (В базе данных это «низкая избирательность».)
- Для 10-страничной книги нет смысла делать индекс, так как вы можете получить 10-страничную книгу с префиксом 5 страниц, что просто глупо - просто сканируйте 10 страниц и сделайте с ними ,
- Индекс также должен быть полезен - обычно нет смысла индексировать, например, частоту буквы «L» на странице.
Создать индекс
-- Create an index for column 'name' in table 'my_table'
CREATE INDEX idx_name ON my_table(name);
Создать уникальный индекс
Уникальный индекс предотвращает вставку дублированных данных в таблицу. Значения NULL
могут быть вставлены в столбцы, которые составляют часть уникального индекса (так как по определению значение NULL
отличается от любого другого значения, включая другое значение NULL
)
-- Creates a unique index for column 'name' in table 'my_table'
CREATE UNIQUE INDEX idx_name ON my_table(name);
Индекс падения
-- Drop an index for column 'name' in table 'my_table'
DROP INDEX idx_name ON my_table;
Создание комбинированного индекса
Это создаст составной индекс обоих ключей, mystring
и mydatetime
и ускорит запросы с обоими столбцами в WHERE
.
CREATE INDEX idx_mycol_myothercol ON my_table(mycol, myothercol)
Примечание: порядок важен! Если поисковый запрос не включает оба столбца в WHERE
, он может использовать только самый левый индекс. В этом случае запрос с mycol
в WHERE
будет использовать индекс, поиск запроса для myothercol
без также ищу mycol
не будет. Для получения дополнительной информации ознакомьтесь с этим сообщением в блоге .
Примечание. В связи с работой BTREE столбцы, которые обычно запрашиваются в диапазонах, должны иметь самое правое значение. Например, столбцы DATETIME
обычно запрашиваются как WHERE datecol > '2016-01-01 00:00:00'
. Индексы BTREE обрабатывают диапазоны очень эффективно, но только если столбец, запрашиваемый как диапазон, является последним в составном индексе.
Кнопка AUTO_INCREMENT
CREATE TABLE (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY(id),
... );
Основные примечания:
- Начинается с 1 и увеличивается на 1 автоматически, когда вы не можете указать его на
INSERT
или указать его какNULL
. - Иды всегда отличаются друг от друга, но ...
- Не делайте никаких предположений (без пробелов, последовательно генерируемых, не повторно используемых и т. Д.) О значениях id, отличных от уникальных в любой данный момент времени.
Тонкие ноты:
- При перезапуске сервера значение «next» «вычисляется» как
MAX(id)+1
. - Если последняя операция перед отключением или сбоем заключалась в удалении самого высокого идентификатора, этот идентификатор может быть повторно использован (это зависит от двигателя). Таким образом, не доверяйте auto_increments, чтобы быть постоянно уникальными ; они уникальны в любой момент.
- Для многомашинных или кластерных решений см.
auto_increment_offset
иauto_increment_increment
. - Это нормально, если что-то другое, как
PRIMARY KEY
и просто делатьINDEX(id)
. (Это оптимизация в некоторых ситуациях.) - Использование
AUTO_INCREMENT
в качестве «ключаPARTITION
» редко полезно; сделать что-то другое. - Различные операции могут «записывать» значения. Это происходит, когда они предварительно выделяют значения (-ы), а затем не используют их:
INSERT IGNORE
(с ключом dup),REPLACE
(которыйDELETE
плюсINSERT
) и другие.ROLLBACK
- еще одна причина для пробелов в идентификаторах. - В репликации вы не можете доверять идентификаторам, чтобы достигнуть ведомого (-ов) в порядке возрастания. Хотя идентификаторы назначаются в последовательном порядке, операторы InnoDB отправляются
COMMIT
порядкеCOMMIT
.