Сможет использовать только 1 индекс, который, в зависимости от данных, урежет выборку. Но все остальные условия where придётся разбирать уже самому mysql, для этого вычитывая даже ненужные строки.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Ответ, очевидно, находится в мануале
upd. Кроме предыдущего комментария, существуют еще тонкости (см. ссылку выше)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Okula
Отправлено: 02 Октября, 2012 - 14:35:35
Участник
Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010
Помог: 42 раз(а)
EuGen, спасибо, всё понял. А если довавить как первый так и второй вариант из первого поста индексы будут использоваться в любом случае при таких запросах:
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Okula пишет:
А если довавить как первый так и второй вариант из первого поста
Имеется ввиду - создать индекс по колонке A, создать индекс по колонке B и создать индекс по колонкам A,B ? Если да, то в случае использования в WHERE условия по A и B - будет использоваться двойной индекс, если в WHERE условие только по A - зависимо (теоретически, может быть ситуация, когда в зависимости от запроса будет использоваться двойной индекс), но в чистов виде будет использован индекс по A; ну и, наконец, если условие WHERE будет только по B - то, разумеется, возможно использовать только индекс по B.
Важное замечание - условие должно быть точным левым подмножеством многоколоночного индекса, чтобы MySQL смогла его использовать. То есть, к примеру, имея индекс по A,B,C и условие WHERE A=5 && C=4 - MySQL не будет использовать индекс, тогда как при условии WHERE A=5 && B=4 - MySQL сможет использовать такой индекс.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Мелкий
Отправлено: 02 Октября, 2012 - 16:32:42
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
EuGen пишет:
имея индекс по A,B,C и условие WHERE A=5 && C=4 - MySQL не будет использовать индекс
не будет использовать индекс для поиска C. А левая часть для поиска по A будет задействована (если оптимизатор не найдёт индекс A&C или вовсе не выберет FullScan, если индекс по A недостаточно уникален)
----- PostgreSQL DBA
Okula
Отправлено: 02 Октября, 2012 - 16:37:34
Участник
Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010
Помог: 42 раз(а)
Всем спасибо, помогли прояснить ситуацию
EuGen
Отправлено: 02 Октября, 2012 - 16:38:36
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Мелкий пишет:
не будет использовать индекс для поиска C. А левая часть для поиска по A будет задействована
Ровно то же самое, что тройной индекс не будет использован (в полном смысле). Более того, с очень большой долей вероятности случится
Мелкий пишет:
выберет FullScan
- как раз по причине недостаточной cardinality
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
vanicon
Отправлено: 03 Октября, 2012 - 01:34:19
Частый посетитель
Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010 Откуда: Самара
Помог: 17 раз(а)
Читал посты выше и тоже заинтересовало...
Вот у меня есть табличка c полями A и B.
И я делаю вот такие запросы:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.