Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Долго выполняется запрос что можно предпринять
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
Написал БД для недвижимости, на любом итпе объекта может быть сколько угодно параметров которые берутся из справочников, взял добавил рандомно 50 тыс записей,
при вводе нового объекта срабатывает поиск на соответствие, так вот если параметров не было показывает общее количество объектов и с лимитом немного объектов.
Так вот первый раз это происходит минуты 2, потом справляется за пол секунды, но стоит внести новый объект то опять первый раз около 2х минут, можно как это решить?
запрос большой много LEFT JOIN для выдергивания параметров, пример:
SELECT`RS-CMS_adresat_object`.*,`dir_param_ws`.value AS param_ws ,`param_test`.value_int AS param_test ,`dir_param_floor`.value_int AS param_floor ,`dir_param_material`.value AS param_material ,`param_s_k`.value_int AS param_s_k ,`param_rrr`.value_int AS param_rrr ,`dir_param_names`.value AS param_names ,`param_info`.value AS param_info ,`param_price`.value_int AS param_price ,`dir_param_city`.value AS param_city FROM`RS-CMS_adresat_object`LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS`param_ws`ON`param_ws`.object_id =`RS-CMS_adresat_object`.id AND`param_ws`.id_directory=16 LEFTJOIN`RS-CMS_adresat_directory_values`AS`dir_param_ws`ON`dir_param_ws`.id =`param_ws`.link AND`dir_param_ws`.id_directory=16 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS param_test ON`param_test`.object_id =`RS-CMS_adresat_object`.id AND`param_test`.id_directory=19 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS`param_floor`ON`param_floor`.object_id =`RS-CMS_adresat_object`.id AND`param_floor`.id_directory=14 LEFTJOIN`RS-CMS_adresat_directory_values`AS`dir_param_floor`ON`dir_param_floor`.id =`param_floor`.link AND`dir_param_floor`.id_directory=14 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS`param_material`ON`param_material`.object_id =`RS-CMS_adresat_object`.id AND`param_material`.id_directory=15 LEFTJOIN`RS-CMS_adresat_directory_values`AS`dir_param_material`ON`dir_param_material`.id =`param_material`.link AND`dir_param_material`.id_directory=15 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS param_s_k ON`param_s_k`.object_id =`RS-CMS_adresat_object`.id AND`param_s_k`.id_directory=20 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS param_rrr ON`param_rrr`.object_id =`RS-CMS_adresat_object`.id AND`param_rrr`.id_directory=22 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS`param_names`ON`param_names`.object_id =`RS-CMS_adresat_object`.id AND`param_names`.id_directory=23 LEFTJOIN`RS-CMS_adresat_directory_values`AS`dir_param_names`ON`dir_param_names`.id =`param_names`.link AND`dir_param_names`.id_directory=23 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS param_info ON`param_info`.object_id =`RS-CMS_adresat_object`.id AND`param_info`.id_directory=17 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS param_price ON`param_price`.object_id =`RS-CMS_adresat_object`.id AND`param_price`.id_directory=24 LEFTJOIN`RS-CMS_adresat_directory_values_to_object`AS`param_city`ON`param_city`.object_id =`RS-CMS_adresat_object`.id AND`param_city`.id_directory=10 LEFTJOIN`RS-CMS_adresat_directory_values`AS`dir_param_city`ON`dir_param_city`.id =`param_city`.link AND`dir_param_city`.id_directory=10 WHERE`RS-CMS_adresat_object`.type_id=:type GROUPBY`RS-CMS_adresat_object`.id ORDERBY`RS-CMS_adresat_object`.date_add DESCLIMIT10
(Добавление)
на хосте проверил занимает 33 секунды это дело, но все равно это очень долго для 50 тыс объектов (Добавление)
на сколько я понял запрос возникает длительный если происходит запрос без условий, если есть хоть одно условие помимо WHERE `RS-CMS_adresat_object`.type_id=:type то все происходит быстро
Viper
Отправлено: 21 Марта, 2016 - 15:28:06
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
Что с индексами по выбираемым полям?
EXPLAIN вам в помощь
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Я конечно всё понимаю, но тут 15 лефт джоинов (15 карл!!!), может в этом проблема?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
3d_killer
Отправлено: 21 Марта, 2016 - 16:23:17
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
OrmaJever а как я еще получу кучу параметров из других таблиц?
3d_killer
Отправлено: 21 Марта, 2016 - 16:30:18
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
Добавил пару индексов пока не могу проверить Прикреплено изображение (Нажмите для увеличения)
tuareg
Отправлено: 21 Марта, 2016 - 16:38:22
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Нужно разобраться с using filesort + using temporary
а так все у Вас нормально.
T1grOK
Отправлено: 21 Марта, 2016 - 20:08:50
Частый гость
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013
Помог: 7 раз(а)
Все дело в сортировке (да и вездесущие LEFT JOIN ничего хорошего не принесут). Сортировка, слияние результатов таблиц(join merge) очень дорогое удовольствие.
Смотрите SHOW STATUS.
Скорей всего в буферы не помещается результат - sort_buffer_size, tmp_table_size, max_heap_table_size и т.д. Зависит от результата SHOW STATUS и используемого движка.
P.S. Даже, если все будет помещаться в буферы, то врят ли удастся получить приемлемое время выполнения. Здесь несколько путей:
- повысить процессорную мощь и более производительную подсистему хранения использовать(SSD)
- разбить запрос на несколько мелких
- денормализовать БД
- установить Sphinx и скормить данные ему.
----- Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
tuareg
Отправлено: 21 Марта, 2016 - 22:14:29
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Тот эксплейн, видно же что он не совсем тот. Ну не может быть при таком эксплейне время 33 секунды.( там что индусы вручную сортируют?) Ну да 15 left join, но это не не так критично.
Там либо правда очень медленное железо, но это просто проверяется. Либо кто-то кого-то обманывает
Сам по себе запрос не страшен. Тяжел но не страшен. Не надо бояться join-ов.
Сфинкс здесь вообще причем? Денормализация тоже вряди, видно же что это движок какой-то. Что тут денормализуешь? Мелкие запросы это да возможно ... .
type_id хорошо отсекает там всего 3 записи.
3d_killer
Отправлено: 21 Марта, 2016 - 23:31:31
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
с ключами шевелится быстро, но до первого инсерта, потом похоже переиндексация, первый запрос тупит, а данных надо добавлять много (Добавление)
движок MyIsam, на InnoDb тупит еще больше (Добавление)
я даже низнаю что будет когда данными наполнится таблица RS-CMS_adresat_directory_values_ to_object она по идее раз в 15 больше из которой делаю основной селект, сейчас она пустая практически
Viper
Отправлено: 21 Марта, 2016 - 23:46:40
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
3d_killer пишет:
с ключами шевелится быстро, но до первого инсерта, потом похоже переиндексация, первый запрос тупит, а данных надо добавлять много
говорите конкретнее. "шевелится быстро" понятие растяжимое. приведите конфу железа и реальные цифры, а не мифическое "уминя ничево неработает!!111 миня всиво ажтрисет!!11"
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
проверьте на локальном хосте. Движок MyIsam не может быть быстрей(ладно намного быстрей) чем InnoDB. Скорей всего это "кривая" настройка или слабое железо, мало памяти
T1grOK
Отправлено: 22 Марта, 2016 - 07:12:03
Частый гость
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013
Помог: 7 раз(а)
3d_killer пишет:
с ключами шевелится быстро, но до первого инсерта
Mysql помещает результаты запросов в кеш и при повторных запросах отдает из кеша. При вставке или обновлении записей кеш сбрасывается.
----- Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
3d_killer
Отправлено: 22 Марта, 2016 - 08:11:04
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
на локальном хосте под openserver
SSD 512 запись чтение, проц i3 2,8 4 ядра, 8 гигов оперативы, но нагрузки я не замечал,
база построена на PDO может попробовать Postgre поставить? (Добавление)
что то подключил через postgre а оно вобще не пашет, подключается без ошибок но запросы не выполняет, вот например
Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013
Помог: 7 раз(а)
В PostgresSQL нет понятия ENGINE, также нет понятия AUTO_INCREMENT, но есть понятие sequence, который является отдельным объектом в данной СУБД.
P.S. Вы предпочитаете бежать от проблемы, чем решать ее. PostgresSQL по умолчанию настроен таким образом, чтобы запуститься даже на калькуляторе, так что неизбежно придется конфигурировать те или иные параметры.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.