вопрос с несколькими индексами mysql - PullRequest
3 голосов
/ 29 октября 2009

У меня есть таблица (пользователи) со столбцами как

id INT AUTOINVREMENT PRIMARY
uid INT index
email CHAR(128) UNIQUE
activated TINYINT 

И мне нужно запросить эту таблицу следующим образом:

SELECT * FROM users WHERE uid = ? AND activated = 1

Мои вопросы: поскольку для столбца 'uid' задан индекс, для того чтобы получить максимальную производительность для указанного выше запроса, нужно ли мне также устанавливать другой индекс для столбца 'активированный'? Эта таблица (будет большой) будет активно использоваться операторами INSERT, UPDATE и SELECT.

Как я узнал из других источников, индексы идут вразрез с операторами INSERT и UPDATE, поэтому, если индекса для столбца uid достаточно для запроса выше, мне не нужно будет устанавливать другой индекс для активированного для повышения производительности вставки и обновления.

Ответы [ 3 ]

4 голосов
/ 29 октября 2009

В любом случае MySQL будет использовать только 1 индекс на таблицу, поэтому наличие дополнительного индекса не поможет.

Однако, если вы хотите действительно оптимальной производительности, определите свой индекс для обоих столбцов в следующем порядке: (например, 1 индекс на 2 столбца)

index_name (uid, activated)

Это позволит оптимизировать поиск только uid или uid AND activated.

0 голосов
/ 29 октября 2009

Создание индекса не заставит вас выбирать медленнее.

Однако, это сделает их значительно быстрее, только если ваш поиск по отличается от событий.

Этот индекс будет полезен только в том случае, если большинство ваших учетных записей активированы и вы ищете неактивированных или наоборот: большинство ваших учетных записей не активирован и вы ищете активирован единицы.

Создание этого индекса также улучшит параллелизм UPDATE и DELETE: без этого индекса все учетные записи (как активированные, так и неактивированные) для данного uid будут заблокированы на время операции UPDATE в InnoDB.

Однако дополнительный индекс, конечно, будет препятствовать производительности DML.

0 голосов
/ 29 октября 2009

Это зависит от вашего распределения данных и селективности UID от селективности UID и активирован. Если у вас много уникальных значений uid, и это будет иметь высокую селективность, то есть поиск uid = x возвращает только несколько строк, тогда включение в индекс даст небольшое значение. Тогда как если uid = x возвращает много строк, а uid = x и activ = 1 возвращает несколько строк, то в индексе есть значение.

Трудно дать конкретный ответ, не зная о распределении данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...