У меня есть запрос, работающий в Mysql, например (запутанные имена)
explain
select this_.id as id1_0_,
this_.column1 as column1,
this_.column2 as column2,
this_.column3 as column3,
this_.column4 as column4,
this_.column5 as column5,
from
tablename this_
where
this_.column1 like '/blah%'
and this_.column2 = 'a9b51a14-4338-94f7-f23dbf9d539e'
and this_.column3 <> 'DUH'
and this_.column4=0
and this_.column5 like '%somename%'
order by this_.created desc
limit 20
Изменить: столбец 1 имеет индекс BTREE, столбец 2, столбец 3, столбец 4, столбец 5, созданные все имеют индексы HASH.
Таблица имеет один внешний ключ, который выбирается в предложении select, но не в предложении WHERE.
Мне говорили и читали, что
как %somename%
приведет к полному сканированию таблицы. Однако, когда я запустил объяснение, вывод объяснения
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE this_ ref somecolumnandinexnames 111 const 30414 Using where
Вывод объяснения выглядит точно так же, если я уберу подобное предложение.
Основываясь на этом, мы решили запустить запрос в производство только для того, чтобы обнаружить, что на практике запрос с like выполнялся намного дольше (несколько секунд по сравнению с несколькими миллисекундами без Like).
Есть ли объяснение, почему объяснение не предупредило меня об этом заранее?
Изменить: наблюдения
- Убрав порядок, запрос снова будет выполняться быстро, даже если LIKE все еще присутствует.
- Разделение на подзапрос с подобным во внешнем запросе, как указано ниже в посте, действительно работает!
Как говорит @Uueerdo, перемещение остальных условий в подзапрос фактически повышает производительность! Поэтому у меня возникает соблазн заключить, что одна из вещей, которые могут произойти, заключается в том, что предложение WHERE с подобным выполняется до других условий, ведущих к большому набору результатов. Как говорит @Uueerdo, перемещение остальных условий в подзапрос фактически повышает производительность! Поэтому у меня возникает соблазн заключить, что одна из вещей, которые могут произойти, заключается в том, что предложение WHERE с подобным выполняется до других условий, ведущих к большому набору результатов. Однако у меня до сих пор нет объяснения, почему удаление порядка ускоряет производительность. Запрос выбирает все 10 строк, поэтому порядок должен быть довольно быстрым.
Есть ли способ увидеть порядок, в котором MYSQL оценивает запрос. Кажется, я помню, как однажды видел какое-то графическое представление в MS SQL Server, объясняющее планы. Не помню, было ли это точно так же.