SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.02.2011 13:07:36

Microname
Участник
Зарегистрирован: 24.07.2010
Сообщений: 8

Помогите оптимизировать запрос

Есть таблица cars_items (marka,model,checked)

Нужно выбрать уникальные модели, их количество и количество, где cheched = Yes

SELECT marka, model, count(model) as cnt,
  (SELECT count(*) FROM cars_items as t2 WHERE marka = mt.marka AND model = mt.model AND checked = 'Yes') as checked
FROM cars_items as mt GROUP BY marka,model ORDER BY marka,model

Результат 133 записи
запрос занял 1.2541 сек. Это долго.
Профилирование говорит, что mysql сначала ищет (SELECT count(*)......  для ВСЕХ! машин в базе (около 10000),
а затем делает GROUP BY

Как выполнить подзапрос ПОСЛЕ GROUP BY ?

Отредактированно Microname (07.02.2011 13:08:21)

Неактивен

 

#2 07.02.2011 16:17:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите оптимизировать запрос

Никак, после группировки у Вас уже будут отсеянные данные ведь?

Я вижу два варианта:
1. два независимых запроса
SELECT marka, model, COUNT(*) FROM cars_items GROUP BY 1,2;
SELECT marka, model, COUNT(*) FROM cars_items WHERE checked = 'Yes' GROUP BY 1,2;
Понадобятся индексы на (marka, model) и, возможно, (checked, marka, model) — если
машинок checked немного.

2. Один запрос без индекса (зато однопроходный)
SELECT marka, model, SUM(IF(checked='Yes', 1, 0)), COUNT(*) FROM cars_items GROUP BY 1,2

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson