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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mysql Оптимизация запроса 
:(
    Опции темы
Sanchezzz
Дата 26.12.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Есть запрос

Код

SELECT SQL_CALC_FOUND_ROWS   ce.*  , v1.value as name , v2.value as user_group
        FROM `cblock_element` ce
            INNER JOIN ( SELECT * FROM cblock_type_value WHERE 
                    id_type_feald=1 AND
                    id_lang=1
                     AND value  !='Новость' 
                group by id_element ORDER BY value ASC 
                ) v1 ON( v1.id_element =  ce.id_element )

                    INNER JOIN ( SELECT * FROM cblock_type_value WHERE 
                    id_type_feald=2 AND
                    id_lang=1
                     AND CAST(value as SIGNED)  >= 0 
                group by id_element ORDER BY value ASC 
                ) v2 ON( v2.id_element =  ce.id_element )

                
        WHERE 
        (ce.time_to >= 1324876220 OR ce.time_to =0) 
        AND ce.`id_cblock_g`= 1
        AND ce.parent_id =0 
        ORDER BY ce.`sort` ASC, ce.`time` DESC   ,  CAST(user_group AS SIGNED)
        LIMIT 0, 30



Вставок  INNER JOIN бывает много но все они отличаются разными id_type_feald и условием выборки

можно ли такой запрос оптимизировать, я не очень силен в mysql ( 


Это сообщение отредактировал(а) Sanchezzz - 26.12.2011, 10:18


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
AndreyIQ
Дата 26.12.2011, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вам точно нужно во всех подзапросах использовать сортировку и если я не ошибаюсь , то у Вас половина индексов не сработают из-за подзапросов
ЗЫ Особо не разбирался с запросом, поэтому возможно написал бред
PM MAIL   Вверх
Sanchezzz
Дата 26.12.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да группировка и сортировка лишняя в под запросе, избавились от временной таблицы для сортировки при каждом доп inner join

еще бы ускорить )



--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
AndreyIQ
Дата 26.12.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Попробуйте, так:
Код

SELECT SQL_CALC_FOUND_ROWS   ce.*  , v1.value as name , v2.value as user_group
        FROM `cblock_element` ce
            INNER JOIN cblock_type_value v1 ON ( v1.id_element =  ce.id_element )
            INNER JOIN cblock_type_value v2 ON ( v2.id_element =  ce.id_element )
        WHERE
            (ce.time_to >= 1324876220 OR ce.time_to =0) 
            AND ce.`id_cblock_g`= 1
            AND ce.parent_id =0 
            AND v1.id_type_feald=1 
            AND v1.id_lang=1
            AND v1.value  !='Новость' 
            AND v2.id_type_feald=2 
            AND v2.id_lang=1
            AND CAST(v2.value as SIGNED)  >= 0 
            ORDER BY ce.`sort` ASC, ce.`time` DESC   ,  CAST(user_group AS SIGNED)
        LIMIT 0, 30

ЗЫ Есть ли возможность избавиться от CAST, просто в некоторых случаях (а может и во всех) с ним не рабоают индексы
ЗЫ Если не поможет, надо смотреть на индексы, может там где косяк
PM MAIL   Вверх
Akina
Дата 26.12.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Цитата(AndreyIQ @  26.12.2011,  11:38 Найти цитируемый пост)
Есть ли возможность избавиться от CAST, просто в некоторых случаях (а может и во всех) с ним не рабоают индексы

Использование любой функции делает невозможным использование индекса.

CAST(v2.value as SIGNED)  >= 0 

Понятно, что v2.value имеет место быть строкой - но какой? если выровненной влево - проверяйте первый символ на минус ака тире, если нет - ещё и тримайте слева, всё равно будет быстрее, чем преобразовывать тип.

CAST(user_group AS SIGNED)

Предположу, что user_group положительное... тогда почему приводим к знаковому? ну и чтобы снизить накладные расходы на сортировку, есть смысл хранить в виде строки определённой длины с заполнением ведущими нулями. 

PS. Я понимаю подход с хранением свойств в единой таблице... но не пойти ли ради ускорения работы по пути хранения свойств в двух полях, а не в одном? т.е. не cblock_type_value(id_element,value), а cblock_type_value(id_element,str_value,num_value)... если значение строковое, во втором поле null, иначе заполнены оба поля, причём чисельное - строго из триггера (поскольку подсистема целостности тут не сумеет контролировать, хотя бы так). И подстёгивать в запрос поле чисельного либо строкового типа - в зависимости от того, какое нужно...
PPS. Понятно, что подобный выкрутас допустим только в случае, когда быстродействие очень критично.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Sanchezzz
  Дата 26.12.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



AndreyIQ -  Абсолютно по скорости также выходит .. 

Akina преобразование типа делается в том случаи если искомая строка задана в функции поиска как строка и не число )
Я бы с радостью переделал таблицу на 2 типа  но весь сайт работает на этой таблице системы нипель...





--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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