У меня есть запрос
SELECT foo FROM bar WHERE some_column = ?
Я могу получить объяснить план от MySQL, не заполняя значение для параметра?
Пока вы выполняете только равные (а не подобные, которые могут повлиять на короткое замыкание), просто замените его значением:
EXPLAIN SELECT foo FROM bar WHERE some_column = 'foo';
Поскольку на самом деле он не выполняет запрос, результаты не должны отличаться от фактических. В некоторых случаях это не так (я уже упоминал LIKE). Вот пример различных случаев LIKE
:
SELECT * FROM a WHERE a.foo LIKE ?
Foo
- Можно использовать сканирование индекса, если индекс существует. % Foo
- Требуется полное сканирование таблицы, даже если индекс существует Foo%
- Может использовать сканирование индекса, в зависимости от от мощности индекса и других факторов Если вы присоединяетесь, и предложение where приводит к невозможной комбинации (и, следовательно, происходит короткое замыкание). Например:
SELECT * FROM a JOIN b ON a.id = b.id WHERE a.id = ? AND b.id = ?
Если первый и второй параметры совпадают, у него один план выполнения, а если они разные, он выполнит короткое замыкание (и вернет 0 строк, не затрагивая никаких данных) ...
Есть другие, но это все, о чем я могу сейчас подумать ...
Не думаю, что это возможно.
WHERE some_column = 'value'
, WHERE some_column = other_column
и WHERE some_column = (ВЫБРАТЬ .. ИЗ a JOIN b JOIN c ... WHERE ... ORDER BY. .. LIMIT 1)
возвращает разные планы выполнения.
План объяснения может быть разным в зависимости от того, что вы вводите. Я думаю, что объяснительные планы без реального параметра ничего не значат.