Вообщем хочу разобраться и раставить все точки над 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 написал(а):
Спустя 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.
Вообще, как показывает практика, 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) Семён написал(а):
Быстрее использовать кеш
--- А если по теме то запросы в студию и соответственно список индексов

--- А если по теме то запросы в студию и соответственно список индексов
_____________
Заработок для веб-разработчиков: CodeCanyon
Мое Портфолио