ПРИМЕЧАНИЕ: исходный вопрос спорный, но сканирование на дно для чего-то важного.Как оптимизировать запросы MySQL с помощью констант?
У меня есть запрос, я хочу, чтобы оптимизировать, который выглядит примерно так:
select cols from tbl where col = "some run time value" limit 1;
Я хочу знать, что используются клавиши, но все, что я пройти, чтобы объяснить, что может оптимизировать ИНЕКЕ ничто («Невозможно, ГДЕ заметило ...»), потому что я накормил его постоянной.
- Есть ли способ сказать mysql не делать постоянные оптимизации в объяснении?
- Я что-то пропустил?
- Есть ли лучший способ получить необходимую информацию?
Редактировать: EXPLAIN
, похоже, дает мне план запроса, который будет получен из постоянных значений. Поскольку запрос является частью хранимой процедуры (и планы запросов IIRC в файлах создаются до их вызова), это делает меня нехорошим, потому что значение не является постоянным. Я хочу, чтобы узнать, какой план запроса будет генерировать оптимизатор, когда он не знает, что такое фактическое значение.
Я пропустил что-то?
Редакция 2: Кажется, что MySQL в запросах в другом месте, по-видимому, всегда регенерирует планы запросов, если вы не уходите с пути, чтобы повторно использовать их. Даже в хранимых процедурах. Из этого, похоже, мой вопрос спорный.
Однако это не делает то, что я действительно хотел бы знать, спорный вопрос:Как оптимизировать запрос, содержащий значения, которые постоянны в пределах какого-либо конкретного запроса, но где я, программист, не известны заранее какое значение будет использовано? - Например, мой код на стороне клиента генерирует запрос с номером в его статье where
. Несколько раз число приводит к тому, что невозможно, если пункт в других случаях это не будет. Как я могу использовать объяснение, чтобы проверить, насколько хорошо оптимизирован запрос?
Лучший подход, который я вижу с самого начала, - это запустить EXPLAIN
на нем для полной матрицы существующих/не существующих случаев. На самом деле это не очень хорошее решение, так как это будет трудно и непросто сделать вручную.
Пустота из тех, которые решают мою проблему. Я хочу знать, что такое план запроса, где оптимизатор * не знает *, если значение находится в столбце. – BCS 2008-11-23 03:01:28
Вот как это работает: Оптимизатор определяет, возможен ли выбор, читая таблицы констант и системы, если это тогда, вы получаете план запроса. Мое решение даст вам план запроса, потому что оптимизатор не остановится раньше, потому что считает, что запрос невозможно. – 2008-11-23 03:28:24
Да, это даст вам план запроса и позволит избежать проблемы с предложением where, которое никогда не будет передано, но тогда оно будет считать, что предложение where всегда будет проходить, и это тоже не так. Я хочу знать, как все будет работать в обоих случаях. (см. edit2) – BCS 2008-11-23 21:19:28