Оптимизация запроса возможна?

Тема в разделе "Базы данных", создана пользователем @lex, 13 окт 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. @lex

    @lex Постоялец

    Регистр.:
    13 июн 2006
    Сообщения:
    50
    Симпатии:
    3
    Возможно ли оптимизировать запрос:
    Код:
    SELECT
        companies.id as id,
        companies.`name` as name,
        GROUP_CONCAT(DISTINCT categories.`name` ORDER BY city.`name` ASC) as categories,
        GROUP_CONCAT(DISTINCT city.`name` ORDER BY FIELD(city.`id`, 3, 2, 1) DESC, city.`name` ASC) as cities
    FROM
        companies,//10000 записей
        categories, //20 записей
        city,//20000 записей
        companytocities,//60000 записей
        companytocategories//30000 записей
    WHERE
        companies.id=companytocities.id
    AND
        companytocities.city_id=city.id
    AND
        company2categories.id=companies.id
    AND
        categories.id=companytocategories.category_id
    GROUP BY
        companies.id
    ORDER BY
        companies.date
    DESC;
    
    Время выполнения ~3 секунды
    Индексы на своих местах.
     
  2. everest

    everest

    Регистр.:
    20 дек 2006
    Сообщения:
    197
    Симпатии:
    20
    на вскидку - можно поиграться с цепочкой
    в ней от перемены местами условий может измениться общее количество цепочек и соответственно время запроса. Хотя здесь только объединение...
    Или поэкспериментируйте с разнами JOIN
     
  3. p486

    p486 Постоялец

    Регистр.:
    11 сен 2010
    Сообщения:
    94
    Симпатии:
    0
    не знаю. может этот вариант в данном случае не подходит но можно создать дополнительные поля с хешами значений которые являются строковыми.

    Добавлено через 53 секунды
    и перед запросом создавать хеш нужного значения
     
  4. @lex

    @lex Постоялец

    Регистр.:
    13 июн 2006
    Сообщения:
    50
    Симпатии:
    3
    Запрос существенно(0,3 сек) ускорился и стал таким:
    PHP:
    SELECT
        companies
    .id as id,
        
    companies.`name` as name,
        
    companies.adding_date as date,
        
    GROUP_CONCAT(DISTINCT companies_categories.`nameORDER BY companies_categories.`nameASC) as categories,
        
    GROUP_CONCAT(DISTINCT city.`nameORDER BY FIELD(city.`id`, 123DESCcity.`nameASC) as cities
    FROM
        
    (SELECT companies.id as idcompanies.name as namecompanies.adding_date FROM companies ORDER BY companies.adding_date DESC LIMIT 0,10companies,
        
    companies_categories,
        
    city,
        
    companies_company2cities,
        
    companies_company2categories
    WHERE
        companies
    .id=companies_company2cities.id
    AND
        
    companies_company2cities.city_id=city.id
    AND
        
    companies_company2categories.id=companies.id
    AND
        
    companies_categories.id=companies_company2categories.category_id
    GROUP BY
        companies
    .id
    ORDER BY
        companies
    .adding_date DESC
     
Статус темы:
Закрыта.