Создайте следующие индексы:
CREATE INDEX ix_table1_0_1 ON table1 (foo_1, foo_0)
CREATE INDEX ix_table2_20_0 ON table2 (foo_20, foo_0)
и перепишите ваш запрос следующим образом:
SELECT cast( table2.foo_1 AS datetime ) as date,
table1.*, table2.foo_2, foo_3, foo_4, foo_5, foo_6, foo_7, foo_8, foo_9, foo_10, foo_11, foo_12, foo_13, foo_14, foo_15, foo_16, foo_17, foo_18, foo_19, foo_20, foo_21
FROM table1
JOIN table2
ON table2.foo_0 = table1.foo_0
AND table2.foo_20 = "tada"
WHERE table1.bar1 >= NOW()
ORDER BY
table1.foo_1 DESC
LIMIT 0, 10
Первый индекс будет использоваться для ORDER BY
, второй будет использоватьсядля JOIN
.
Однако вы можете получить больше пользы от создания первого индекса, подобного следующему:
CREATE INDEX ix_table1_0_1 ON table1 (bar, foo_0)
, который может применить более строгую фильтрацию к bar
.
У меня есть запись в блоге по этому вопросу:
, который дает советы о том, как выбратьИндекс, создаваемый для подобных случаев.