SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.05.2011 12:07:39

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Как работает оптимизатор в MySQL?

Собственно вопрос простой: существую разные подходы к оптимизации запросов оптимизатором. Основанные на синтаксисе, основанные на стоимости, может ещё какие-то? Можете подсказать как работает в этом плане MySQL? или где об этом можно почитать?
Заранее спасибо!

Неактивен

 

#2 11.05.2011 13:26:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как работает оптимизатор в MySQL?

Вы довольно широку тему затронули. Попробую ответить просто, а дальше спрашивайте.

Оптимизатор MySQL принимает следующие решения:
  1. в каком порядке выполнять JOIN.
  2. какие индексы использовать для WHERE и JOIN и каким способом (включая экзотические алгоритмы, как index merge)
  3. использовать ли индекс или отдавать предпочтение full table scan

В итоге создается план исполнения запроса, который можно приблизительно увидеть, выполнив EXPLAIN.

Влиять на работу оптимизатора можно, используя STRAIGHT_JOIN, USE INDEX, IGNORE INDEX, FORCE INDEX, но фактически этим возможности прямого влияния ограничены.

Неактивен

 

#3 11.05.2011 13:39:50

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Re: Как работает оптимизатор в MySQL?

Попробую уточнить вопрос!
К примеру Oracle использует систему рангов для выбора оптимального плана выполнения... есть ещё подход на основе стоимости выполнения плана... как работает тут mysql?

Неактивен

 

#4 11.05.2011 13:47:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как работает оптимизатор в MySQL?

MySQL использует относительно простые алгоритмы для оценки сложности исполнения запроса. Эта сложность исполнения минимизируется.

Неактивен

 

#5 11.05.2011 16:42:02

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Re: Как работает оптимизатор в MySQL?

Оптимизатор запросов строит множество планов выполнения запроса, а потом на основе чего-то принимает решение о выполнении одного из множества. Вот меня и интересует, на основе каких критериев оптимизатор запросов в MySQL принимает это решение?

Неактивен

 

#6 11.05.2011 17:17:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как работает оптимизатор в MySQL?

Точный алгоритм нужно смотреть в исходниках, но одним из основных критериев является оцениваемое количество строк для перебора.

Неактивен

 

#7 11.05.2011 21:45:25

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Re: Как работает оптимизатор в MySQL?

Значит речь идёт о оценочном подходе.

Неактивен

 

#8 11.05.2011 22:06:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как работает оптимизатор в MySQL?

А как работает Оракл (просто в целях просвещения)?

Неактивен

 

#9 11.05.2011 22:11:43

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Re: Как работает оптимизатор в MySQL?

Если верить Карповой, то используется метод оптимизации основанный на синтаксисе:

http://www.rema44.ru/resurs/study/optimize/optimize.htm написал:

При использовании этого метода план составляется на основании существующих путей доступа и их рангов. Ранжирование путей доступа выполняется на основании знаний о правилах и последовательности осуществления этих путей.
Ранг пути доступа определяется на основании знаний о последовательности реализации этого пути. Например, одна строка по хеш-кластеру с уникальным или первичным ключом (ранг 3) будет выбираться в среднем быстрее, чем одна строка по уникальному или первичному ключу (ранг 4), потому что для получения ROWID строки из хеш-кластера достаточно применить к значению ключа хеш-функцию, а для получения ROWID по индексу требуется лишнее обращение к индексу (который может в данный момент отсутствовать в оперативной памяти, что вызовет обращение к диску).

Метод оптимизации, основанный на синтаксисе, учитывает иерархическое старшинство операций. Если для какой-либо операции существует более одного пути ее выполнения, то выбирается тот путь, чей ранг выше, т.к. в большинстве случаев он выполняется быстрее, чем путь с более низким рангом. План выполнения запроса формируется из выбранных путей доступа с максимальными рангами

Неактивен

 

#10 11.05.2011 22:17:12

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Re: Как работает оптимизатор в MySQL?

Относительно MySQL, запрос обрабатывается в несколько фаз:

Я написал:

На первой фазе осуществляется лексический и синтаксический анализ запроса, формируется представление запроса, отражающее его структуру и содержащее информацию, которая характеризует объекты базы данных, упомянутые в запросе (отношения, поля и константы).

На второй фазе, полученное в результате анализа на первой фазе представление запроса, подвергается логической оптимизации. На этом этапе представление подвергается различным преобразованиям, делающим представление более удобным с точки зрения системы, хотя и являющимся эквивалентным представлению полученному на первой фазе.

На третей фазе обработки строится набор альтернативных процедурных планов выполнения запроса в соответствии с его внутреннем представлением, полученным на второй фазе. Также, для каждого плана оценивается стоимость его выполнения на основе статистической информации о состоянии базы данных. И в результате выбирается среди альтернативных планов тот, который имеет наименьшую стоимость выполнения.

На четвертой фазе формируется выполняемое представление плана.

И на пятой фазе происходит реальное выполнение запроса в соответствии с выполняемым планом запроса.

Собственно из третей фазы видно, что используется метод основанный на стоимости. А конкретные критерии оценки стоимости зависят в том числе и от настроек сервера. Вот, сам у себя нашёл ответ на свой вопрос))) Спасибо огромное за помощь и ещё большее спасибо, если Вы можете опровергнуть или дополнить написанное тут мною!)

Неактивен

 

#11 11.05.2011 22:33:19

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как работает оптимизатор в MySQL?

Мне пока непонятно одно - чем ранг отличается от стоимости. Если в описании про Оракл заменить слово ранг на слово стоимость оно на мой взгляд останется корректным. Не покидает ощущение, что описан в общем один и тот же подход, с точностью до все равно неизвестной реализации.

Вы научный труд пишете? Наверное вам недостатки оптимизатора тоже нужны. Основной недостаток вытекает из основного преимущества MySQL - возможности работать с подключаемыми хранилищами, которые могут в том числе добавляться пользователями и обладать определенными свойствами с точки зрения физического хранения данных. В моем докладе на РИТ есть архитектура MySQL - в ней показано место оптимизатора и подключаемых хранилищ. Видно, что хранилища - внешний элемент и оптимизатор об их свойствах или не знает или знает немного. Отсюда недостаточная информированность о "стоимости" операции.

Неактивен

 

#12 11.05.2011 22:50:52

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Re: Как работает оптимизатор в MySQL?

Да, дипломчик тут у меня...

Я так понимаю, что различие в ранге и стоимости в том, что ранг строится на основе пути доступа, для определения которого проводится анализ синтаксиса запроса. А стоимость учитывает большее количество параметров, вес которых также зависит от многих факторов и для вывода стоимости запроса используется информация о состоянии базы данных. Например распределение значений в столбце.

Опять же, если верить Карповой, то это два принципиально разных подхода... ну, а я пока только разбираюсь что да как)

Оу! просмотрел Вашу презентацию крайне полезная вещь! - огромное спасибо)

Неактивен

 

#13 11.05.2011 23:05:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как работает оптимизатор в MySQL?

Насчет стоимости и MySQL вы правы, для того, чтобы оценить сколько строк потребуется используется внутренняя статистика индексов. Если вы напишете EXPLAIN запроса, он покажет сколько строк выбирается при присоединении каждой таблице - число оценочное, оно не совпадет с итоговым, но в большинстве случаев близкое. Также, если MySQL поймет, что результат - пустое множество, запрос может не выполняться (называется optimized out). Например условие WHERE b>10, но на b есть индекс и MySQL видит, что максимальное значение 5. Кстати, этот метод приводит к тому, что порядок выполнения запроса может измениться по мере наполнения таблиц.

Про Оракл я не знаю, если он действительно не учитывает статистику данных, то это принципиально другой подход, преимущество которого в детерминистичности пути исполнения запроса на основании структуры таблиц.

Неактивен

 

#14 11.05.2011 23:09:18

DubrovinAnton
Участник
Зарегистрирован: 11.05.2011
Сообщений: 9

Re: Как работает оптимизатор в MySQL?

Ну вот) мне главное было разобраться с механизмами MySQL) спасибо за помощь!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson