Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: План выполнения запроса
 
 автор: Ильдар   (19.02.2012 в 01:45)   письмо автору
 
 

есть запрос вида
SELECT *, IF ((TO_DAYS(NOW()) - TO_DAYS(sq.AddDate)) < 4, 
                (TO_DAYS(NOW()) - TO_DAYS(sq.AddDate)) , sq.AddDate) AS print_date, 
                DATE_FORMAT(sq.AddDate, '%H:%i') AS print_time 
                FROM suppliers_filters AS sf 
                INNER JOIN suppliers_queries AS sq 
                ON 
                sq.car_mark_id = sf.filter_mark AND
                IF (sf.filter_model, sq.car_model_id = sf.filter_model, sq.car_model_id IS NOT NULL) 
                WHERE sq.Archive = '0' AND 
                sf.supplierID = 1431 AND 
                sq.Year BETWEEN IF(sf.filter_start_year = 0, 1901, sf.filter_start_year) 
                AND IF(sf.filter_end_year = 0, 2155, sf.filter_end_year)  
                ORDER BY QueryID DESC LIMIT 10000

В каком порядке пройдет выборка по столбцам?
Просто словил file sort, хочу выяснить какого индекса не хватает...

  Ответить  
 
 автор: cheops   (19.02.2012 в 11:10)   письмо автору
 
   для: Ильдар   (19.02.2012 в 01:45)
 

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

  Ответить  
 
 автор: Ильдар   (19.02.2012 в 14:01)   письмо автору
 
   для: cheops   (19.02.2012 в 11:10)
 

А пордяк выборки какой будет, можешь подсказать? Я до сих пор не понимаю по конца как это делает майскул при join

  Ответить  
 
 автор: cheops   (19.02.2012 в 14:08)   письмо автору
 
   для: Ильдар   (19.02.2012 в 14:01)
 

>А пордяк выборки какой будет
Не очень понятно, что имеется в виду под порядком выборки?

  Ответить  
 
 автор: Ильдар   (20.02.2012 в 08:20)   письмо автору
 
   для: cheops   (19.02.2012 в 14:08)
 

Ах, да, не уточнил :)
Ну например:
Снчала будет выполняться стравнение ON
потом WHERE друг за другом: archive, supplierID и т.д. (или всетаки задом на перед?)
и уже в конце ORDER BY

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

  Ответить  
 
 автор: cheops   (20.02.2012 в 11:22)   письмо автору
 
   для: Ильдар   (19.02.2012 в 01:45)
 

1. Сначала две таблицы suppliers_filters и suppliers_queries будут объединены в большую таблицу.
2. На этапе формирования будет использоваться ON-условие
3. Во-время формирования объединенной таблицы также будут вычислены все поля в SELECT-запросе
4. Затем к полученной таблице будут применены WHERE-условия одно за другим, не обязательно в том порядке, каком вы указали, MySQL попытается использовать те условия, которые отбрасывают больше записей пустить первыми (в прочем при большом количестве условий это может не работать).
5. Затем полученный результат будет отсортирован ORDER BY в обратном порядке по полю QueryID
6. Из него будут отобраны первые 10000 записей.

  Ответить  
 
 автор: Ильдар   (20.02.2012 в 14:40)   письмо автору
 
   для: cheops   (20.02.2012 в 11:22)
 

Интересное конечно поведение mysql в условии Where...
спасибо

  Ответить  
 
 автор: cheops   (20.02.2012 в 18:14)   письмо автору
 
   для: Ильдар   (20.02.2012 в 14:40)
 

Это нужно план выполнения запроса смотреть, используя EXPLAIN EXTENDED + SHOW WARNINGS. В результате можно увидеть как MySQL планирует реально выполнять условия.

  Ответить  
 
 автор: Sfinks   (20.02.2012 в 18:30)   письмо автору
 
   для: cheops   (20.02.2012 в 18:14)
 

А это куда и когда писать надо?
Просто тоже актуально. Вчера заметил, что одна и та же выборка с LEFT JOIN выполняется 0,0607 сек, а с RIGHT JOIN 0,0044 сек. Почти в 15 раз быстрее. Хотелось бы эту разницу наглядно увидеть!

  Ответить  
 
 автор: cheops   (20.02.2012 в 18:39)   письмо автору
 
   для: Sfinks   (20.02.2012 в 18:30)
 

Копать следует оператор EXPLAIN, он к сожалению, работает только с SELECT-запросами и скажем так не все выдает и в довольно своеобразной форме, но это лучше, чем ничего.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования