Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Индексы, (какие лучше создать) 
:(
    Опции темы
just_sage
  Дата 30.10.2008, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Всем здравствуйте,

Досталась вот по наследству от предыдущих программистов уже заполненная БД, главный поисковый запрос выполняется очень медленно, около 30 сек.

Для оптимизации добавил индексы, но это не помогло.

Собственно сам запрос:

Код

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(group.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 group
            ON group.id = main.group_id
            LEFT OUTER JOIN sm_region as region
            ON region.id = main.city_id
            LEFT OUTER JOIN sm_products_images as img ON img.pid = main.id
            WHERE img.pid IS NOT NULL AND UNIX_TIMESTAMP(main.updated) BETWEEN (UNIX_TIMESTAMP(now())-86400) AND UNIX_TIMESTAMP(now())
            AND main.type_products = 'sale'
            AND main.years BETWEEN 1950 AND 2008
            AND main.working_life > '20081029231051' AND main.brand_id <> 0 AND 1
            GROUP BY main.id
            ORDER BY  brand.name asc
            LIMIT 0, 12



Созданные индексы:
sm_products: brand_id, model_id, years, working_life, updated, type_products
sm_products_images: pid

Самый тяжелые таблички:
sm_products: около 85 тыс. записей
sm_images: около 300 тыс. записей

Добавление индексов не повлияло на скорость, может не там добавляю ? 
PM MAIL   Вверх
skyboy
Дата 30.10.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



explain делал?
если нет - сделай, если да - приведи результат.
PM MAIL   Вверх
Zloxa
Дата 30.10.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



1) не понятно условие:
Цитата(just_sage @  30.10.2008,  01:35 Найти цитируемый пост)
main.brand_id <> 0 AND 1

2) я не увидел model_id в критерии отбора, его наличие в индексе не позволяет использовать индексный доступ по years, working_life, updated, type_products. Попробовать убрать model_id из индекса(или, если он нужен для других запросов, поставить его последним в списке)
3) отбор по main.updated используется по функции, это не позволяет использовать индекс. соответственно по индексу не будет производиться отбор по updated, type_products. Тоже самое что в п 2). Либо убрать из индекса, либо подвинуть в зад, либо отказаться от использования функции, елси это возможно, или же эта функция не является какой либо языковой особенностью, позволяющей осуществлять индексный доступ по функции .

ЗЫ. Хотел бы сразу оговориться, что я не обладаю достаточными компетенциями по МySQL. Возможно эта платформа имеет некоторые специфики или особенности. Приведенные мною замечания характерны для других платформ, с коими мне доводилось иметь дело.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
just_sage
Дата 30.10.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 не действует, так как записи не абс-но одинаковые =(
PM MAIL   Вверх
Zloxa
Дата 30.10.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(just_sage @  30.10.2008,  12:39 Найти цитируемый пост)
Тем болле что DISTINCT не действует, так как записи не абс-но одинаковые 

Цитата

В MySQL расширены возможности использования оператора GROUP BY. Теперь в выражениях SELECT можно использовать столбцы или вычисления, которые не присутствуют в части GROUP BY. Это справедливо для любой возможной величины для этой группы. Данная возможность позволяет повысить производительность за счет исключения сортировки и группирования ненужных величин.
.....
Не используйте данное свойство, если столбцы, пропущенные в части GROUP BY, не являются уникальными в данной группе! Возможны непредсказуемые результаты. 

ТУТ


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
just_sage
Дата 31.10.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.