Сократить время поиска

aLx_od

Новичок
Сократить время поиска

Здравствуйте, ув. мастера.

Имеется каталог CD-дисков.

Таблица "ДИСКИ"
| id_diska (INDEX) | название диска |
Число строк 30000

Таблица "КАТЕГОРИИ"
| id_kategorii (INDEX) | Название категории |
Число строк 1000

Таблица "ДИСКИ-КАТЕГОРИИ" (многие-ко-многим)
| id_diska (INDEX) | id_kategorii (INDEX) |
Число строк 150000

Задача:
на главной странице возле названия каждой категории отобразить количество дисков в ней.

Мое решение:
по каждой категории SELECT COUNT(*) FROM ДИСКИ-КАТЕГОРИИ WHERE id_kategorii=X GROUP BY id_diska

Недостаток:
очень длительное время подсчета и, соответственно, загрузки главной страницы.

Вопрос:
Можно ли подобную задачу решить иначе, или нужно создавать отдельную таблицу где будет содержаться эта информация и обновлять ее при каждом добавлении нового диска?

Спасибо.
 

Alexandre

PHPПенсионер
Можно ли подобную задачу решить иначе, или нужно создавать отдельную таблицу где будет содержаться эта информация и обновлять ее при каждом добавлении нового диска?
Если оптимизация не дает нужного результата, то лучше построить дополнительную таблицу.

Про оптимизацию запросов читай последний Инсайд
 

aLx_od

Новичок
пересмотрел индексы. Стало быстрее.
Вот только запрос
SELECT COUNT(*) FROM ДИСКИ-КАТЕГОРИИ WHERE id_kategorii=X GROUP BY id_diska

выдает не значение, а таблицу с 1 столбцом.
какая-то проблема с GROUP BY id_diska, т.к. без него работает нормально.
Но мне нужны именно уникальные значенения поля id_diska.
 

voituk

прозревший
попробуй SELECT COUNT(DISTINCT * ) FROM ...

Хотя я сомневаюсь что это что-то изменит.

-~{}~ 23.01.07 13:12:

А лучше покажи РЕАЛЬНЫЕ запросы и EXPLAIN на них.
 

aLx_od

Новичок
Вот реальная таблица: CONT_TOVAR (id_cont; id_tovar)
I
Вот два запроса:
select count(*) from CONT_TOVAR where ID_TOVAR=3 group by ID_CONT
select count(*) from CONT_TOVAR where ID_TOVAR=3
Вот их EXPLAIN : http://www.web-line.us/explain.gif

Результат первого - таблица с 1 столбцом и 50 строками. В каждой ячейке значение 1.
Результат второго - число 50, - то что нужно, но мне нужно количество уникальных значений ID_CONT, т.е. group by ID_CONT
 

aLx_od

Новичок
Vallar_ultra
и что?
результат такой же как и в первом запросе + еще один столбец, а мне нужно просто "50"
 

Vallar_ultra

Любитель выпить :)
aLx_od

Тебе блин что надо, посмотреть сколько записей соответствует условию `id_tovar` = 3, или сколько на КАЖДОМ `id_cont`записей с условием `id_tovar` = 3???????

-~{}~ 24.01.07 13:32:

Если надо "посмотреть сколько записей соответствует условию `id_tovar` = 3", то
[sql]
SELECT COUNT( DISTINCT `id_cont` )
FROM CONT_TOVAR
WHERE `id_tovar` =3
[/sql]
 

chira

Новичок
aLx_od
выдает не значение, а таблицу с 1 столбцом.
какая-то проблема с GROUP BY id_diska, т.к. без него работает нормально.
Но мне нужны именно уникальные значенения поля id_diska.
трудно понять почему тебя не устраивает запрос без GROUP BY который тебе возвращает то , что ты хочешь
а мне нужно просто "50"
может тебе нужно нечто другое: список ID категорий с количеством в них дисков?
SELECT `id_tovar` , COUNT(*)
FROM CONT_TOVAR
GROUP BY `id_tovar`
или
SELECT `id_kategorii` , COUNT(*) AS disk_count
FROM DISK_KATEG
GROUP BY `id_kategorii`
 
Сверху