MySQL игнорирует подраздел в запросе - PullRequest
2 голосов
/ 05 мая 2011

У меня есть таблица, которая разделена по диапазону по id и по хешу по коду (оба являются целыми числами). 30 разделов, 4 хэшированных подразделов в каждом, всего 120.

Если я делаю выбор только по идентификатору, план объяснения показывает, что он корректно сокращается только до тех разделов и подразделов, которые с ним связаны (4)

Если я делаю выборку по идентификатору + код, план объяснения показывает, что он правильно сокращается до одного конкретного подразделения, связанного с ним (1)

ОДНАКО ...

Если я делаю выбор только по коду, план объяснения, похоже, показывает, что MySQL выполняет полное сканирование таблицы (120 разделов), вместо того, чтобы действовать как Oracle и сканировать только один подраздел каждого раздела, который будет иметь отношение 30 всего).

Должен ли я сделать что-то особенное, чтобы MySQL воспользовался возможностью сокращения подразделов, когда он не может удалить целые разделы? Или MySQL (по крайней мере, 5.1) просто не поддерживает использование преимуществ подразделов?

1 Ответ

0 голосов
/ 06 мая 2011

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

Последний пример:

Предположим, что 'таблица' разделена диапазоном на A и подразделена хешем на B.

Запрос 1: «ВЫБРАТЬ * из таблицы, где A =? И B =? И C =?»:

  • Будет работать должным образом под MySQL 5.1 и новее. MySQL будет игнорировать любой раздел, связанный с диапазоном, не включающим значение A, и будет игнорировать любой раздел, не связанный со значением B. В худшем случае, он выполняет поиск методом перебора только строк в одном подразделе одного раздела.

Запрос 2: «ВЫБЕРИТЕ A из таблицы, где B =? И C =?»:

  • Может работать должным образом в MySQL 5.5 и новее. Если бы Oracle работал правильно, в худшем случае он бы искал один подраздел из каждого диапазона разделов. Если бы у вас было 20 разделенных диапазонов и 4 подраздела в каждом, в худшем случае он будет выполнять поиск методом перебора через 20 подразделов.

  • Не будет работать должным образом в MySQL 5.1. Он будет перебирать все 80 подразделов один за другим и в основном выполнит полное сканирование таблицы.

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