2015-08-25 4 views
0

У меня есть таблица предложений, которая имеет более 100 тыс. Строк, поэтому запрос ниже очень медленный (4сек - средний).Внутреннее соединение медленное выполнение

SELECT cat1.id AS cat1id, 
    cat1.title_gr AS title, 
    cat1.order 

    FROM categories_groups_cat1 AS cat1 

    INNER JOIN 
     (SELECT categories_id, categories_groups_cat1_id FROM 
     categories_vs_groups 
     GROUP BY categories_groups_cat1_id) AS vs 
    ON vs.categories_groups_cat1_id=cat1.id 

    INNER JOIN 
     (SELECT id, title_gr FROM 
     categories 
     GROUP BY title_gr) AS cats 
    ON cats.id=vs.categories_id 

    INNER JOIN 
     (SELECT category_gr FROM 
     offers 
     GROUP BY category_gr) AS offers 
    ON offers.category_gr=cats.title_gr 

    GROUP BY cat1.id 
    ORDER BY cat1.order ASC 

таблица предлагает

`id` int(11) NOT NULL, 
`title` text NOT NULL, 
`description` text NOT NULL, 
`image` text NOT NULL, 
`price` float NOT NULL, 
`start_price` float NOT NULL, 
`brand` text NOT NULL 
`category_gr` text NOT NULL 

стол categories_groups_cat1

`id` int(11) NOT NULL, 
`order` int(11) NOT NULL, 
`title_gr` text NOT NULL 

таблицы categories_vs_groups

`id` int(11) NOT NULL, 
`categories_groups_cat1_id` int(11) NOT NULL, 
`categories_id` int(11) NOT NULL 

табличные категории

`id` int(11) NOT NULL, 
`title_gr` char(255) NOT NULL 

Я стараюсь выбирать из категорий_groups_cat1, где существуют предложения, поэтому я использую внутреннее соединение. Я не знаю, полностью ли это. Если будет другое более быстрое (эффективное) решение, я был бы признателен

+2

100k строк ничего. Вы установили индексы и/или внешние ключи для своих таблиц? – WhoIsJohnDoe

+1

Пожалуйста, отредактируйте свой вопрос с данными образца и желаемыми результатами. Я думаю, что запрос слишком сложный для того, что вы хотите. Кроме того, ваш запрос имеет 'offers.category_gr', но я не вижу этот столбец в таблице. –

+0

Почему вы делаете так много подзапросов в своих объединениях? В чем цель? – rlanvin

ответ

3

Вам следует избегать подзапроса, который создает таблицу temp. Это, безусловно, улучшит производительность. Подзапросы, которые создают временную таблицу в памяти, убивают производительность, старайтесь избегать столько, сколько сможете.

Я изменил ваш код. Там могут быть небольшие синтаксические ошибки.

SELECT cat1.id AS cat1id, 
     cat1.title_gr AS title, 
     cat1.order 

     FROM categories_groups_cat1 AS cat1 

     INNER JOIN 
      categories_groups_cat1_id AS vs 
     ON vs.categories_groups_cat1_id=cat1.id 

     INNER JOIN 

      categories 
      AS cats 
     ON cats.id=vs.categories_id 

     INNER JOIN 

      offers 

     ON offers.category_gr=cats.title_gr 

     GROUP BY cat1.id,cats.title_gr, offers.category_gr 
     ORDER BY cat1.order ASC 
Смежные вопросы