2015-08-23 1 views
0

У меня есть 5 столов:MySql множественные присоединяется к 5 таблиц с ошибками таймаута

Categories_groups_cat1

id|order|title(text) 

Categories_vs_groups

id|categories_groups_cat1_id|categories_id 

Категория

id|title(text) 

Предложения

id|category (text) 

купоны

id|category (text) 

Я хочу, чтобы отобразить заголовки из Categories_groups_cat1 только если:

существует по крайней мере одну строку в Categories_vs_groups через колонку categories_groups_cat1_id (Categories_vs_groups.categories_groups_cat1_id == Categories_groups_cat1.id) И category_id из категорий_vs_groups существует как минимум одна строка в таблице. Категории (Категории.ид == Категории_vs_groups.categories_id) И, где есть хотя бы одна строка в таблице. Предложения или купоны через колонку категории (categories.category == categories.title) !!

я делаю следующее, но у меня есть тайм-аут, поскольку таблица или предлагает купоны более тх 500000.

SELECT 
      offers.category_gr, 
      categories.id, categories.title_gr, 
      categories_vs_groups.categories_id, 
      categories_vs_groups.categories_groups_cat1_id AS cat1, 
      categories_vs_groups.categories_groups_cat2_id AS cat2 

     FROM offers 
     LEFT JOIN categories 
     ON categories.title_gr=offers.category_gr 
     LEFT JOIN categories_vs_groups 
     ON categories_vs_groups.categories_id=categories.id 

     WHERE categories.title_gr='$row_best_offer[category_gr]' 

     GROUP BY categories.id 
     order by categories.id 
+0

принимающей среды, время после 60 секунд? 'показывать переменные, где variable_name in ('wait_timeout', 'interactive_timeout')' – Drew

+0

Нет! Но даже это для веб-сайта. Мне нужно загрузить через 2-3 секунды! – GG13

+0

'show create table offers' и т. Д. Для всех 3 таблиц ... тогда мы можем обдумать вашу стратегию индекса. – Drew

ответ

0

Если у вас есть правильный набор мер, ваш запрос не должен занимать более 60 секунд.

Ваш пункт where является откручиванием первый LEFT JOIN (и вы, вероятно, не нужен второй тоже. Потому что вы агрегирование по категориям, я предложил бы начать с этого. Тогда, таблица offers только необходима для фильтрации, так вы должны рассмотреть, действительно ли это необходимо

Итак, рассмотрим этот вопрос:..

SELECT c.category_gr, c.id, c.title_gr, 
     cvg.categories_id, cvg.categories_groups_cat1_id AS cat1, 
     cvg.categories_groups_cat2_id AS cat2 
FROM categories c JOIN 
    offers o 
    ON c.title_gr = o.category_gr LEFT JOIN 
    categories_vs_groups cvg 
    ON cvg.categories_id = c.id 
WHERE c.title_gr = '$row_best_offer[category_gr]' 
GROUP BY c.id 
ORDER BY c.id; 

Для достижения наилучших результатов, вы хотите индексы categories(title_gr, category_gr, id), offers(category_gr) и categories_vs_groups(categories_id)

0
  1. вместо использования Condtion WHERE categories.title_gr='$row_best_offer[category_gr]' в том, где положение, поставить его в пункте О

  2. Первый левый присоединиться ненужно.

    ВЫБОР offers.category_gr, categories.id, categories.title_gr, categories_vs_groups.categories_id, categories_vs_groups.categories_groups_cat1_id AS cat1, categories_vs_groups.categories_groups_cat2_id AS CAT2

    ИЗ предложения РЕГИСТРИРУЙТЕСЬ Категории ON (category.title_gr = offers.category_gr и категории.title_gr = '$ row_best_offer [category_gr]')

    LEFT JOIN categories_vs_groups ПО categories_vs_groups.categories_id = categories.id

    GROUP BY categories.id порядке categories.id

Смежные вопросы