Можно ли как-то запретить MySQL выполнять полное сканирование таблицы, если результат не был найден с помощью индексов?
Например, этот запрос:
SELECT *
FROM a
WHERE (X BETWEEN a.B AND a.C)
ORDER BY a.B DESC
LIMIT 1;
Эффективно только в том случае, если X удовлетворяет условию, и возвращается хотя бы 1 строка, но если условие не может быть удовлетворено какими-либо данными в таблице, будет выполнено полное сканирование, которое может быть очень дорогостоящим.
Я не хочу оптимизировать этот конкретный запрос, это всего лишь пример.
ПОЯСНИТЕ на этот запрос с X внутри или за пределами диапазона:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE a range long_ip long_ip 8 \N 116183 100.00 Using where
STATUS VARIABLE показывает гораздо лучшую информацию. Для X вне диапазона:
Handler_read_prev 84181
Key_read_requests 11047
В диапазоне:
Handler_read_key 1
Key_read_requests 12
Если бы только был способ не допустить, чтобы Handler_read_prev когда-либо проходил мимо 1.
ОБНОВЛЕНИЕ. Я не могу принять свой собственный ответ, потому что он действительно не отвечает на вопрос (хотя HANDLER - отличная функция). Мне кажется, что нет никакого общего способа предотвратить полное сканирование MySQL. Хотя простые условия, такие как key = 'X', будут рассматриваться как "невозможные где", более сложные вещи, такие как BETWEEN, не будут.