Построение архитектуры для высоконагруженных систем

Ваяс
Дата: 24.12.2012 09:44:45
Прошу помощи в решении проблемы связанной с построением более грамотной архитектуры таблиц. Есть справочники по городам россии есть таблица с объявлениями о недвижимости. И вот что бы осуществить поиск, мне приходиться связывать 6 таблиц. Из десяти тысяч записей запрос выполняется 3 секунды и это очень долго.
В общих чертах таблицы следующие
SELECT 
 obj.city_id, obj.city, obj.square, obj.square_live, obj.storeys, obj.floor, 
	obj.square_kitchen, obj.microarea, obj.street, obj.house, obj.roomscount, 
	obj.price_all, (area.name) raion, (microarea.name) microraion,
	(material.name) material, (housetype.name) house_type, house.construct_year
FROM an_objects obj 
LEFT JOIN mlt_adr_area area 
	ON area.id = obj.area_id 
LEFT JOIN mlt_adr_microarea microarea 
	ON microarea.id = obj.microarea_id 
LEFT JOIN an_housetypes housetype 
	ON housetype.id = obj.housetype_id 
LEFT JOIN an_materials material 
	ON material.id = obj.material_id 
LEFT JOIN mlt_adr_house house
	ON house.street_id = obj.street_id

В таблице an_objects есть id района он связывается с таблицой с районами
В таблице an_objects есть id микрорайона он связывается с таблицой с микрорайонами
В таблице an_objects есть id типа дома он связывается с таблицой с тип домов
Ну и т.д. думаю мысль понятна. Вот как лучше можно организовать данную систему?
tanglir
Дата: 24.12.2012 10:31:31
Ваяс
Вот как лучше можно организовать данную систему?
1)зачем лефт джойн?
2)индексы на связующие поля есть?
trew
Дата: 24.12.2012 10:42:13
Ваяс,

покажите план запроса:
explain
Ваяс
Дата: 24.12.2012 11:38:19
[quot tanglir]
Ваяс
1)зачем лефт джойн?
2)индексы на связующие поля есть?

А как же без left join?
Индексов всего скорее нет, т.к. я сам их не делал.
trew
покажите план запроса:
explain

Вот это если я правильно понял что нужно файл прикрепил
Ваяс
Дата: 24.12.2012 11:41:24
Вот ещё интересно, возможно ли как то по чистить все в SQL индексы и т.д. так скажем отдефрагментировать
А после задать все по человечески. Это каким то образом исследуется?
Я думаю есть что то похожее просто я не знаю как искать правильно.
tanglir
Дата: 24.12.2012 11:50:53
Ваяс
А как же без left join?
А с иннерджойн, например.
Индексы, судя по эксплейну, есть. Странно. 20 килозаписей и целых 6 секунд?
tanglir
Дата: 24.12.2012 11:51:47
Кстати, а почему вы не весь запрос показали?
trew
Дата: 24.12.2012 11:55:48
Ваяс,

ANALYZE TABLE - чтобы обновлялась статистика по таблицам

Покажите структуру таблицы mlt_adr_house
Ваяс
Дата: 24.12.2012 12:05:15
[quot tanglir]
Ваяс
А с иннерджойн, например.

Он тогда вообще больше двух минут выполняется, и почему так происходить я понять не могу.
Вообще всего где то млн записей в основной таблице, и по 300 килозаписей в других таблицах, там используется справочник кладр, но у меня вообще виснит все безбожно, если я связываю эти записи. Но если делать выборку по всем (как я уже сказал их больше млн) записям то все просто останавливается.
Весь запрос формируется динамически и он примерно от 40 до 400 строк собирается, но там все типовое. а вот основное это вот
SELECT 
	obj.id, UNIX_TIMESTAMP(obj.date), obj.city_id, obj.city, 
	obj.square, obj.square_live, obj.storeys, obj.floor, 
	obj.square_kitchen, obj.microarea, obj.street, obj.house, obj.roomscount, 
	obj.price_all, (area.name) raion, (microarea.name) microraion,
	(material.name) material, (housetype.name) house_type, house.construct_year
FROM an_objects obj 
LEFT JOIN mlt_adr_area area 
	ON area.id = obj.area_id 
LEFT JOIN mlt_adr_microarea microarea 
	ON microarea.id = obj.microarea_id 
LEFT JOIN an_housetypes housetype 
	ON housetype.id = obj.housetype_id 
LEFT JOIN an_materials material 
	ON material.id = obj.material_id 
LEFT JOIN mlt_adr_house house
	ON house.street_id = obj.street_id
WHERE livedays > 0 AND type_id = 1 AND rubric_id = 1 AND obj.street LIKE '%%'
AND IF('' = '', true, obj.floor = 5) 
AND IF('' = '', true, obj.storeys = 16)
AND IF('' = '', true, obj.house LIKE '2%')
AND IF('' = '', true, obj.price_all BETWEEN 2450 AND 5200)
AND 
CASE 
		WHEN '' = '' THEN true 
		WHEN '1' < 5 THEN obj.roomscount = '1' 
		WHEN '1' >= 5 THEN obj.roomscount >= '1' 		
END
GROUP BY id ORDER BY date ASC
qwerty112
Дата: 24.12.2012 12:07:13
Ваяс
GROUP BY id ORDER BY date ASC

а это, извините, зачем ?