![]() |
|
Модераторы: skyboy |
![]()
|
|
| just_sage |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
Всем здравствуйте,
Досталась вот по наследству от предыдущих программистов уже заполненная БД, главный поисковый запрос выполняется очень медленно, около 30 сек. Для оптимизации добавил индексы, но это не помогло. Собственно сам запрос:
Созданные индексы: sm_products: brand_id, model_id, years, working_life, updated, type_products sm_products_images: pid Самый тяжелые таблички: sm_products: около 85 тыс. записей sm_images: около 300 тыс. записей Добавление индексов не повлияло на скорость, может не там добавляю ? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
||||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
1) не понятно условие:
2) я не увидел model_id в критерии отбора, его наличие в индексе не позволяет использовать индексный доступ по years, working_life, updated, type_products. Попробовать убрать model_id из индекса(или, если он нужен для других запросов, поставить его последним в списке) 3) отбор по main.updated используется по функции, это не позволяет использовать индекс. соответственно по индексу не будет производиться отбор по updated, type_products. Тоже самое что в п 2). Либо убрать из индекса, либо подвинуть в зад, либо отказаться от использования функции, елси это возможно, или же эта функция не является какой либо языковой особенностью, позволяющей осуществлять индексный доступ по функции . ЗЫ. Хотел бы сразу оговориться, что я не обладаю достаточными компетенциями по МySQL. Возможно эта платформа имеет некоторые специфики или особенности. Приведенные мною замечания характерны для других платформ, с коими мне доводилось иметь дело. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| just_sage |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
Спасибо за советы. Оказалось, что все дело в GROUP BY, без него все летает. Также последовал рекоммендациям Zloxa отн-но индексов.
Только появилась другая проблема: в выборке не должно быть записей с повторяющимися main.id (т.е. для каждого продукта нужно выбирать только одну картинку.). При этом каждой записи в sm_products может соответствовать несколько записей в sm_products_images, поэтому в выборке без GROUP BY main.id содержатся дубликаты, которые GROUP BY собсно и убирало. А как от этого избавиться - не знаю. =( Еще раз спасибо что помогаете, может добъем до конца ? Добавлено через 2 минуты и 3 секунды При добавлении DISTINCT - тоже начинает тормозить =( Добавлено через 12 минут и 36 секунд Тем болле что DISTINCT не действует, так как записи не абс-но одинаковые =( |
|||
|
||||
| Zloxa |
|
||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
ТУТ -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||
|
|||||
| just_sage |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
Всем, спасибо, более менне разобрался и решил проблему вот так:
пришлось в sm_products добавить новую колонку image_id, заполнить ее MIN(id) из sm_products_images и делать JOIN с дополнительным условием, зато нет GROUP BY, которое все тормозит SELECT main.id, main.price, main.user_id, main.years, main.type_currency, UNIX_TIMESTAMP(GREATEST(main.created, main.updated)) as modified, CONCAT(IFNULL(brand.name,''),' ', IFNULL(model.name,''), ' ', IFNULL(REPLACE(pgroup.name,model.name,''),'')) as name, region.name as city, img.image as image, img.image_w as image_w,img.image_h as image_h, main.weight, main.color FROM sm_products as main LEFT OUTER JOIN sm_brands as brand ON brand.id = main.brand_id LEFT OUTER JOIN sm_models as model ON model.id = main.model_id LEFT OUTER JOIN sm_groups as pgroup ON pgroup.id = main.group_id LEFT OUTER JOIN sm_region as region ON region.id = main.city_id JOIN sm_products_images as img ON img.pid = main.id AND img.id=main.image_id WHERE (main.updated <= '2008-10-31 15:36:39' AND main.updated >= '2008-10-30 15:36:39') AND main.type_products = 'sale' AND main.years BETWEEN 1950 AND 2008 AND main.working_life > '20081030212440' AND main.brand_id <> 0 AND 1 ORDER BY main.years asc LIMIT 0, 12 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |