Оптимизация работы сайта.

Sat

Guest
Оптимизация работы сайта.

Есть две таблицы:

1.Object:
ObjectID - int
CategoryID - int

2. Category
Name - varchar
CategoryID

В рубрикаторе выводятся категории в скобочках стоит кол-во наименований в этой категории.

Сейчас это количество считается так:
select * from category
потом цикл по категориям
select count(*) from Object where CategoryID=$id

Но БД большая, и в итоге такое чтение занимает много времени. Есть какие-нибудь способы оптимизировать этот процесс?
 

Sat

Guest
индекс только по ID-y

Я кстати немного напутал.

Связка немного другая. Получается так:
1. Object
Object ID

2. Category
CategoryID

3. Link
ObjectID
CategoryID

Т.е. все связки вообще в левой таблице хранятся. Сделано это потому, что один объект может быть в разных категориях.

До этого там был реализован БэкОфис (админилка на БД), и у неё есть функции которые все данные зачитывают в массивы ПХП. И я решил сам в БД не лезть, а использовать уже существующие функции.

вот там и получается до хрена циклов, из-за которых тормозит сайт.

P.S. Сорри что сразу неправильно объяснил, но я этот сайт больше года назад написал, а сейчас решил залезть и поправить.
 

Сергей123

Новичок
SELECT Name, COUNT(Link.ObjectID)
FROM Category LEFT JOIN Link USING(CategoryID)
GROUP BY Category.CategoryID

В Object и Category - индекс по id, а в Link есть?

-~{}~ 28.01.05 15:58:

Только, конечно, сумма этих чисел будет, в общем случае, больше, чем общее кол-во объектов (так как это структура для случая, когда один объект может быть в нескольких категориях).
 

Sat

Guest
В Link составной ключ.

-~{}~ 28.01.05 17:35:

Ну с этим разобрался. Большое спасибо.

А как получить из таблицы все первые символы с которых начинается текст в поле Name?

т.е. мне нужен список для того-же рубрикатора, для перехода по первой букве. Сейчас зачитывается весь список, и средствами ПХП выбираются первые буквы (тут уже количество не надо указывать).
 

Сергей123

Новичок
Оптимально - не знаю,
но какой-нибудь SELECT DISTINCT LEFT(Name, 1) побыстрее твоего варианта будет, наверное.
 
Сверху