Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте, для практики делаю что-то вроде сервиса по бронированию номеров. Есть вот такой запрос, фильтр для поиска свободных номеров. Цены сортируются с учетом количества дней. например если меньше 7 дней, то сортировка идет по room.price, если больше 7 и меньше 30 дней по room.price_week, если больше 30 дней по room.price_month, но это все вычисляется с помощью php. Цена вычисляется с прибавлением комиссии сервиса (В данном случае 5%).
Отредактированно webJunior (06.04.2017 12:21:15)
Неактивен
от файловой сортировки (Using temporary; Using filesort) никак.
можно лишь уточнить где создается временная таблица - в памяти или на диске
show status like
Created_tmp_disk_tables -- количество неявных временных таблиц на диске, созданных во время выполнения операторов.
сравните значение до и после выполнения запроса, при необходимости увеличьте tmp_table_size
от all у busy_dates, имхо, не избавится
а вот заставить использовать room_1 можно, но стоит ли? сервер думал прежде чем отказаться от него
и зачем вы числовые значения указываете как строки?
Неактивен
vasya написал:
от файловой сортировки (Using temporary; Using filesort) никак.
можно лишь уточнить где создается временная таблица - в памяти или на диске
show status like
Created_tmp_disk_tables -- количество неявных временных таблиц на диске, созданных во время выполнения операторов.
сравните значение до и после выполнения запроса, при необходимости увеличьте tmp_table_size
от all у busy_dates, имхо, не избавится
а вот заставить использовать room_1 можно, но стоит ли? сервер думал прежде чем отказаться от него
и зачем вы числовые значения указываете как строки?
Насчет числовых значений, да действительно, исправил.
Created_tmp_disk_tables до запроса 0, после запроса 4. tmp_table_size 25m, чтобы проверить увеличил до 100, тот же результат. Никак нельзя оптимизировать такой запрос?
Отредактированно webJunior (06.04.2017 23:58:46)
Неактивен
webJunior написал:
tmp_table_size 25m, чтобы проверить увеличил до 100, тот же результат.
увеличьте ещё max_heap_table_size и емнип, наличие text/blob тоже приводят к такому результату.
Неактивен
vasya написал:
webJunior написал:
tmp_table_size 25m, чтобы проверить увеличил до 100, тот же результат.
увеличьте ещё max_heap_table_size и емнип, наличие text/blob тоже приводят к такому результату.
Увеличил tmp_table_size 256m, max_heap_table_size 256m. Так же Created_tmp_disk_tables 4
Насчет text/blob имеете ввиду типы полей которые выбираются? Нет там только числовые и varchar
Отредактированно webJunior (08.04.2017 16:15:58)
Неактивен
а в чем вы запускаете запрос? в консоли?
будут ли отличаться показания, если после запроса дважды выполнить
SHOW SESSION STATUS LIKE ‘Created%’;
Неактивен
vasya написал:
а в чем вы запускаете запрос? в консоли?
будут ли отличаться показания, если после запроса дважды выполнить
SHOW SESSION STATUS LIKE ‘Created%’;
В консоли phpmyadmin
SHOW SESSION STATUS LIKE ‘Created%’; выводит ошибку
Ответ MySQL: Документация
#1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MariaDB на предмет корректного синтаксиса около '‘Created%’' на строке 1
Работает только SHOW SESSION STATUS, без каких-либо изменений
Отредактированно webJunior (08.04.2017 17:46:32)
Неактивен
а есть возможность выполнить через консоль, чтобы исключить глюки phpadmina?
Неактивен
vasya написал:
а есть возможность выполнить через консоль, чтобы исключить глюки phpadmina?
Вы правы это глюк phpmyadmin. Запустил через командную строку, SHOW SESSION STATUS LIKE ‘Created%’;
В настройках по умолчанию и с изменениями показывает
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 5 |
| Created_tmp_tables | 0 |
+-------------------------+-------+
Created_tmp_files даже без запроса показывает 5
Отредактированно webJunior (08.04.2017 21:56:04)
Неактивен
webJunior написал:
Created_tmp_files даже без запроса показывает 5
это нормально
возвращаясь к исходному запросу, имхо, вряд ли можно его улучшить
Неактивен
vasya написал:
webJunior написал:
Created_tmp_files даже без запроса показывает 5
это нормально
возвращаясь к исходному запросу, имхо, вряд ли можно его улучшить
Я правильно понимаю, что с увеличением записей в таблицах, при настройках по умолчанию временные таблицы могут создаваться на диске?
Подскажите пожалуйста почему когда идет сортировка по room.id, так же получаю Using temporary; Using filesort?
Неактивен
webJunior написал:
Я правильно понимаю, что с увеличением записей в таблицах, при настройках по умолчанию временные таблицы могут создаваться на диске?
Временная таблица создается на диске если её размер превышает минимум из max_heap_table_size/tmp_table_size. Т.е. это связано с объемом выборки, а не вообще данных. Например, при бронировании вы ищите свободные номера на ближайший месяц, хотя сама таблица может содержать данные о постояльцах за последнее столетие.
webJunior написал:
Подскажите пожалуйста почему когда идет сортировка по room.id, так же получаю Using temporary; Using filesort?
видимо оптимизатор считает, что придется перебрать много записей и проще прочитать последовательно всю таблицу.
http://sqlinfo.ru/forum/viewtopic.php?pid=25439#p25439
Неактивен
Временная таблица создается на диске если её размер превышает минимум из max_heap_table_size/tmp_table_size. Т.е. это связано с объемом выборки, а не вообще данных. Например, при бронировании вы ищите свободные номера на ближайший месяц, хотя сама таблица может содержать данные о постояльцах за последнее столетие.
Т.е размер временной таблицы может зависеть от количества проверяемых строк? То что показывает ячейка rows при Explain?
Неактивен
от количества выбираемых
пусть в таблице N строк
проверяем M строк
удовлетворяет условию выборки X строк
эти X строк сортируются методом файловой сортировки и если X*(размер одной строки) > min(max_heap_table_size/tmp_table_size), то временная таблица создается на диске
rows в explain показывает ожидаемую оптимизатором оценку M
Неактивен
vasya написал:
от количества выбираемых
пусть в таблице N строк
проверяем M строк
удовлетворяет условию выборки X строк
эти X строк сортируются методом файловой сортировки и если X*(размер одной строки) > min(max_heap_table_size/tmp_table_size), то временная таблица создается на диске
rows в explain показывает ожидаемую оптимизатором оценку M
Ясно, большое спасибо!
Неактивен