Оптимизация

Pegiy

Guest
Оптимизация

Необходимо хранить информацию о моделях и ценах в различных магазинах. Сейчас реализовано так:
table shops // магазины: мвидео, порта, ...
table cats // категории: сотовые телефоны, КПК, ...
table marks // марки: sony, siemens, ...
table models // модели {id, id_mark, id_cat, name}
table pricelist // цены в различных магазинах {id, id_model, id_shop, price}
Все работает, но не устраивает скорость, т.к. например, чтобы получить список марок по какой-нибудь категории приходятся выполнять сложные запросы типа этого:
PHP:
select distinct marks.id, marks.label from marks left join models on marks.id=models.id_mark where models.id_cat='1' order by label
Как можно оптимизировать, увеличить скорость работы не меняя структуры БД?
 

clevel

Новичок
индексы, например, плюс дополнительная таблица с избыточной информацией по маркам для каждой категории... вопрос только в том, что чаще происходит - вставка данных, или выборка... думаю, что последнее...
 

Pegiy

Guest
да, именно выборка
т.е. мой вариант - избыточность?
или дополнительные таблицы или дополнительные поля в таблицах?
я встречал вариант когда в Marks добавлено поле id_cat куда через запятую писались категории, но отмел его как разрушающий нормализацию.
 

Pegiy

Guest
немного:
shops - десяток
cats - десяток
marks - сотня
models - пара тысяч
pricelist - десяток тысяч

но при выборке моделей для данной категории, определнной марки и при этом еще и проверка на наличие в прайс-листе - притормаживает


>>Какой тип таблиц?
статические, видимо
 

V.Gubarev

Guest
Конкретные приемы оптимизации придут только с опытом.
Даже в книжках действительно полезного немного.

К примеру, в запросе, который ты привел, не надо стремиться все сделать за один раз.

Сначала достанем иды марок:
select distinct mark_id from models where id_cat='1'
(и индексик по id_cat не забудем поставить)

А потом достанем и названия марок.
Посмотри забавы ради время выполнения.
 

chira

Новичок
Re: Оптимизация

Автор оригинала: Pegiy
Все работает, но не устраивает скорость, т.к. например, чтобы получить список марок по какой-нибудь категории приходятся выполнять сложные запросы типа этого:
PHP:
select distinct marks.id, marks.label from marks left join models on marks.id=models.id_mark where models.id_cat='1' order by label
Как можно оптимизировать, увеличить скорость работы не меняя структуры БД?
c LEFT JOIN ты выбираешь все марки , потом их отфильтровываешь
попробуй так:
select distinct marks.id, marks.label
from marks,models
where marks.id=models.id_mark AND models.id_cat='1'
order by label

для таблицы models построй индексы на id_mark id_cat label
покажи EXPLAIN

тормоза здесь могут быть с DISTINCT, ORDER BY
 

iliyas

Guest
Re: Оптимизация

Автор оригинала: Pegiy
Необходимо хранить информацию о моделях и ценах в различных магазинах. Сейчас реализовано так:
table shops // магазины: мвидео, порта, ...
table cats // категории: сотовые телефоны, КПК, ...
table marks // марки: sony, siemens, ...
table models // модели {id, id_mark, id_cat, name}
table pricelist // цены в различных магазинах {id, id_model, id_shop, price}
Все работает, но не устраивает скорость, т.к. например, чтобы получить список марок по какой-нибудь категории приходятся выполнять сложные запросы типа этого:
PHP:
select distinct marks.id, marks.label from marks left join models on marks.id=models.id_mark where models.id_cat='1' order by label
Как можно оптимизировать, увеличить скорость работы не меняя структуры БД?
Незнаю может это ты уже сделал.
В своей почтовой системе мне удалось сильно ускорить работу выборок уйдя от сравнения строк и введя числовые ID. Моежет тебе стоит ввести дополнительные ID.
Еще попробуй поменять местами таблицы при объединении. Хорошо помогает отсортировать порядок объединения по возрастанию количества полей.
 
Сверху