[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: N-ое кол-во запросов VS LEFT JOIN
forza
Доброе время суток!
Вообщем хочу разобраться и раставить все точки над i.
Я зделал базу данных в ней 3 таблицы:

film_cat_film | CREATE TABLE `film_cat_film` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`meta_title` varchar(255) NOT NULL,
`meta_keywords` text NOT NULL,
`meta_description` text NOT NULL,
`cat_id` int(10) unsigned NOT NULL,
`film_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `cat_id` (`cat_id`),
KEY `film_id` (`film_id`),
CONSTRAINT `film_cat_film_ibfk_2` FOREIGN KEY (`cat_id`) REFERENCES `film_category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `film_cat_film_ibfk_3` FOREIGN KEY (`film_id`) REFERENCES `film_film` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=36709 DEFAULT CHARSET=utf8


film_film | CREATE TABLE `film_film` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`img` varchar(255) DEFAULT NULL,
`added` timestamp NULL DEFAULT NULL,
`href` varchar(255) DEFAULT NULL,
`body` text,
`pre` text,
PRIMARY KEY (`id`),
UNIQUE KEY `href` (`href`)
)
ENGINE=InnoDB AUTO_INCREMENT=20999 DEFAULT CHARSET=utf8


film_category | CREATE TABLE `film_category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`href` varchar(50) DEFAULT NULL,
`meta_title` varchar(255) DEFAULT NULL,
`meta_keywords` text,
`meta_description` text,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
UNIQUE KEY `href` (`href`)
)
ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8


Таблица с категориями содержит 7 записей, таблица с фильмами 19к. записей. таблица со связями категорий и фильмов 31к.

Я захотел выбрать мета теги к фильму, название категории к которой фильм отностися, ид. Одним словом достать из 3 таблиц нужные данные.

Дак вот. Сделал 1 запрос с LEFT JOIN, примерное время выпалние его 1.8-2 секунды (несколько раз пробовал).
Затем сделал 3 запроса по отдельности, т.е сначало к 1ой таблице и т.д -- затратил время 0.8 - 1 секунды.Получил теже данные что и с LEFT JOIN.

В чем заключается вопрос ? А вот в чем. Что лучше использовать? 1 запрос к базе данных и терять ~1 секунду, или 3 запроса к базе данных и выигрывать ~1 секунду? Аргументируйте только свои ответы.



Спустя 3 часа, 51 минута, 52 секунды (5.10.2011 - 21:41) forza написал(а):
Неужели ни у кого нет подобного опыта, и не может ответить на данный вопрос?

Спустя 1 час, 10 минут, 18 секунд (5.10.2011 - 22:52) imbalance_hero написал(а):
forza
Только свои... блин... а ещё бросить работу и бежать отвечать... блиииин...

Спустя 7 минут, 20 секунд (5.10.2011 - 22:59) jetistyum написал(а):
http://www.google.com.ua/search?gcx=w&ix=c...iw=1920&bih=965

там тебе и объяснения и аргументы...

Спустя 8 часов, 47 минут, 5 секунд (6.10.2011 - 07:46) linker написал(а):
Если есть возможность выиграть время, то её нужно использовать - это же логично. Меньше времени - меньшее потребление ресурсов сервера. Чего тут обсуждать и спрашивать.

Спустя 51 минута, 20 секунд (6.10.2011 - 08:38) forza написал(а):
тогда для чего каких целей существует LEFT JOIN?

Спустя 3 часа, 35 минут, 30 секунд (6.10.2011 - 12:13) linker написал(а):
Всё зависит от ситуации и выбирать решение нужно исходя из потребностей. На этот вопрос нет однозначного ответа.

Спустя 14 минут, 24 секунды (6.10.2011 - 12:27) ApuktaChehov написал(а):
У вас индексы расставлены? У меня в таблицах было около 10 000 записей. После расстановки индексов все работает очень быстро. А до этого как раз, несколько секунд происходили выборки.

Вообще, как показывает практика, JOIN-ы работают немного медленнее чем, если выбирать сразу несколько таблиц в FROM.

Спустя 38 минут, 48 секунд (6.10.2011 - 13:06) linker написал(а):
Сразу несколько таблиц в FROM есть аналог одного из JOIN. В любом случае это не всегда верно, я бы вообще поостерёгся так говорить.

Спустя 8 минут, 4 секунды (6.10.2011 - 13:14) ApuktaChehov написал(а):
linker - так это понятно, что аналог. И ясно, что это не одно и тоже, JOIN-ы немного для другого. Но факт остается фактом, JOIN-ы работают немного медленнее. Я сам тестировал. Цифры уже не помню.

Спустя 7 минут, 49 секунд (6.10.2011 - 13:22) Invis1ble написал(а):
ХЗ, я читал где-то (но сам не тестировал, если чесно), что конструкция типа
select `table1`.*, `table2`.*
from `table1`, `table2`

полностью эквивалентна
select `table1`.*, `table2`.*
from `table1`
inner join `table2`

Спустя 25 минут, 1 секунда (6.10.2011 - 13:47) linker написал(а):
ApuktaChehov
Ещё раз повторяю, что очень многое зависит от запроса и от индексов.

Спустя 45 минут, 24 секунды (6.10.2011 - 14:33) Michael написал(а):
Цитата
полностью эквивалентна

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

Спустя 32 минуты, 33 секунды (6.10.2011 - 15:05) Семён написал(а):
Быстрее использовать кеш rolleyes.gif
--- А если по теме то запросы в студию и соответственно список индексов


_____________
Заработок для веб-разработчиков: CodeCanyon
Мое Портфолио
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.