|
|
|
| есть запрос вида
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, хочу выяснить какого индекса не хватает... | |
|
|
|
|
|
|
|
для: Ильдар
(19.02.2012 в 01:45)
| | Да у вас просто скорее всего результирующая таблица такого объема, что она не помещается в оперативной памяти (срабатывает ограничение) и сбрасывается на жесткий диск. Отсюда копать нужно, как бы сначала сделать так, чтобы запрос оставался в оперативной памяти (понятно, что если дело происходит не на сервере, нужно выставить настройки MySQL по крайней мере для временных таблиц и размеров буферов в оперативной памяти такие же, как на сервере). | |
|
|
|
|
|
|
|
для: cheops
(19.02.2012 в 11:10)
| | А пордяк выборки какой будет, можешь подсказать? Я до сих пор не понимаю по конца как это делает майскул при join | |
|
|
|
|
|
|
|
для: Ильдар
(19.02.2012 в 14:01)
| | >А пордяк выборки какой будет
Не очень понятно, что имеется в виду под порядком выборки? | |
|
|
|
|
|
|
|
для: cheops
(19.02.2012 в 14:08)
| | Ах, да, не уточнил :)
Ну например:
Снчала будет выполняться стравнение ON
потом WHERE друг за другом: archive, supplierID и т.д. (или всетаки задом на перед?)
и уже в конце ORDER BY
я хочу собрать новый индекс для этого запроса. | |
|
|
|
|
|
|
|
для: Ильдар
(19.02.2012 в 01:45)
| | 1. Сначала две таблицы suppliers_filters и suppliers_queries будут объединены в большую таблицу.
2. На этапе формирования будет использоваться ON-условие
3. Во-время формирования объединенной таблицы также будут вычислены все поля в SELECT-запросе
4. Затем к полученной таблице будут применены WHERE-условия одно за другим, не обязательно в том порядке, каком вы указали, MySQL попытается использовать те условия, которые отбрасывают больше записей пустить первыми (в прочем при большом количестве условий это может не работать).
5. Затем полученный результат будет отсортирован ORDER BY в обратном порядке по полю QueryID
6. Из него будут отобраны первые 10000 записей. | |
|
|
|
|
|
|
|
для: cheops
(20.02.2012 в 11:22)
| | Интересное конечно поведение mysql в условии Where...
спасибо | |
|
|
|
|
|
|
|
для: Ильдар
(20.02.2012 в 14:40)
| | Это нужно план выполнения запроса смотреть, используя EXPLAIN EXTENDED + SHOW WARNINGS. В результате можно увидеть как MySQL планирует реально выполнять условия. | |
|
|
|
|
|
|
|
для: cheops
(20.02.2012 в 18:14)
| | А это куда и когда писать надо?
Просто тоже актуально. Вчера заметил, что одна и та же выборка с LEFT JOIN выполняется 0,0607 сек, а с RIGHT JOIN 0,0044 сек. Почти в 15 раз быстрее. Хотелось бы эту разницу наглядно увидеть! | |
|
|
|
|
|
|
|
для: Sfinks
(20.02.2012 в 18:30)
| | Копать следует оператор EXPLAIN, он к сожалению, работает только с SELECT-запросами и скажем так не все выдает и в довольно своеобразной форме, но это лучше, чем ничего. | |
|
|
|