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

  • Автор темы Автор темы aLx_od
  • Дата начала Дата начала

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

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

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

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

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

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

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

-~{}~ 23.01.07 13:12:

А лучше покажи РЕАЛЬНЫЕ запросы и EXPLAIN на них.
 
Вот реальная таблица: 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
 
Vallar_ultra
и что?
результат такой же как и в первом запросе + еще один столбец, а мне нужно просто "50"
 
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]
 
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`
 
Сверху