Я не MySQL гуру. С другой стороны, я думаю, что базовые показатели для Oracle схожи. По ним:
Основными драйверами полного сканирования таблицы или сканирования индекса является избирательность. Чем больше разных значений в столбце, тем более вероятным будет индекс. Если база данных ожидает, что будет выбрано более 10 процентов строк, она, скорее всего, будет использовать полное сканирование таблицы.
Полагаю, gridId уникален в таблице сетки. Так что селективность высокая. НО вы используете другой столбец city_id. Это означает, что даже если бы вы использовали индекс для извлечения идентификатора, данные таблицы также необходимы, поскольку там есть дополнительный столбец. И если это означает, что будет выбрано более 10 процентов строк, он не будет использовать индекс.
Существует несколько методов соединения. В зависимости от метода соединения присутствует другое поведение.
Для хеш-соединений и вложенных циклов таблица драйверов является меньшей или наименьшей или той, которая имеет самый избирательный предикат. Итак, я полагаю, что таблица является вашей самой маленькой таблицей. А так как ваш SQL не имеет условий, основанных на эквивалентности (у вас есть> и!!), Вы не должны удивляться, что эта база данных будет использовать наименьшую таблицу в качестве драйвера.
Таким образом, основная причина полного сканирования таблицы заключается в том, что у вас нет какого-либо выборочного условия, и база данных должна начинаться с полного сканирования таблицы, и она выбрала сетку. Вот и все.