[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация запроса
web-monster
Можете сказать, этот запрос нормально составлен или можно как нибудь ускорить? Там инер джоины всякие или так лучше?

SELECT t1.id,t3.id,t1.FromUser,t1.message,t1.time,t2.user,t2.nick,t2.avatar,
t2.dr_day,t2.dr_month,t2.dr_year,t2.strana,t2.region,t2.gorod
FROM stenka t1,anketa t2, sp_goroda t3
WHERE t1.ToUser='dimon'
AND t1.FromUser=t2.user
AND t3.id=t2.gorod
ORDER BY t1.id




Спустя 20 минут, 25 секунд (5.05.2010 - 18:27) dr_Lev написал(а):
По-моему здесь будет лучше с джоинами, т.к. проверка в where работает в конце, после сбора общей таблицы... а представь себе сколько там строк blink.gif ...
можешь проверить :
SELECT count(*) as cnt
FROM stenka t1,anketa t2, sp_goroda t3

Вот запрос с джоинами, в джоине проверка выполняется только для одной таблички (в случае с inner join - для двух):
SELECT t1.id,t3.id,t1.FromUser,t1.message,t1.time,t2.user,t2.nick,t2.avatar,
t2.dr_day,t2.dr_month,t2.dr_year,t2.strana,t2.region,t2.gorod
FROM stenka t1
INNER JOIN anketa t2
ON t1.FromUser=t2.user
INNER JOIN sp_goroda t3
ON t3.id=t2.gorod
WHERE t1.ToUser='dimon'
ORDER BY t1.id

Спустя 1 минута, 1 секунда (5.05.2010 - 18:28) web-monster написал(а):
ну я вообщем имею ввиду) Запрос выбирает из таблицы анкета: ник, аватар, город из таблицы стенка: текст,пользователя,время и из таблицы города выбирает город.

Связка id города в таблице анкета
связка анкета и стенки по пользователю..
Вот мне интересно можно ли этот запрос написать по другому.. Или и этот вариант нормальный? В плане оптимизации.

кол-во строк
cnt
7134558900

Спустя 4 минуты, 34 секунды (5.05.2010 - 18:32) web-monster написал(а):
и ещё вопрос лучше один запрос с джоином чем три разных?

$avatar = mysql_query("SELECT * FROM anketa WHERE user='$roww[FromUser]'");
$rows = mysql_fetch_array($avatar);

$nick1=htmlspecialchars($rows["nick"]);
$dr1=age($rows["dr_month"],$rows["dr_day"],$rows["dr_year"]);
$kogda=russian_date( 'H:i - j F Y года', $roww["time"]);

$gorod_res = mysql_query("SELECT * FROM sp_goroda WHERE id='$rows[gorod]'");
$gor = mysql_fetch_array($gorod_res);
$gorod=$gor["name"];

Спустя 2 минуты, 52 секунды (5.05.2010 - 18:35) dr_Lev написал(а):
и еще, т.к. у тебя вторая таблица anketa t2 связана с остальными то её лучше поставить в FROM и условие, что в WHERE перенести в джоин:
SELECT t1.id,t3.id,t1.FromUser,t1.message,t1.time,t2.user,t2.nick,t2.avatar,
t2.dr_day,t2.dr_month,t2.dr_year,t2.strana,t2.region,t2.gorod
FROM anketa t2
INNER JOIN stenka t1
ON t1.FromUser=t2.user AND t1.ToUser='dimon'
INNER JOIN sp_goroda t3
ON t3.id=t2.gorod
ORDER BY t1.id

Спустя 3 минуты, 34 секунды (5.05.2010 - 18:39) dr_Lev написал(а):
Цитата (web-monster @ 5.05.2010 - 18:32)
и ещё вопрос лучше один запрос с джоином чем три разных?

конечно лучше... ведь сервер базы данных он на то и сервер, чтобы обрабатывать данные... да и в PHP с массивами туговато...

Спустя 5 часов, 43 минуты, 3 секунды (6.05.2010 - 00:22) sergeiss написал(а):
Мной лично проверено на примере Постгре (скорее всего, в MySQL то же самое), что для больших таблиц (когда десятки миллионов записей) в сложных запросах надо обязательно делать "подзапросы".
Для данного случая вместо начального
SELECT t1.id,t3.id,t1.FromUser,t1.message,t1.time,t2.user,t2.nick,t2.avatar,
t2.dr_day,t2.dr_month,t2.dr_year,t2.strana,t2.region,t2.gorod
FROM stenka t1,anketa t2, sp_goroda t3
WHERE t1.ToUser='dimon'
AND t1.FromUser=t2.user
AND t3.id=t2.gorod
ORDER BY t1.id

Можно было бы написать примерно так:

SELECT t1.id,t3.id,t1.FromUser,t1.message,t1.time,t2.user,t2.nick,t2.avatar,
t2.dr_day,t2.dr_month,t2.dr_year,t2.strana,t2.region,t2.gorod
FROM (select id, FromUser, message, time from stenka where ToUser='dimon') t1,
anketa t2, sp_goroda t3
where t1.FromUser=t2.user
AND t3.id=t2.gorod
ORDER BY t1.id

Если записей, удовлетворяющих условию ToUser='dimon' немного, и на указанное поле есть индекс, то общая выборка будет сделана быстрее.
Естественно, что улучшить выборку джойнами тоже можно smile.gif. Я хотел обратить внимание именно на то, что подзапросы - вещь полезная.

А заодно замечу, что указанная структура запроса - это тоже ДЖОЙН smile.gif CROSS JOIN. Только его обычно не указывают в явном виде, но он подразумевается.

И еще. В запросе лучше будет синонимы для t1.id и t3.id.

Спустя 10 часов, 44 минуты, 37 секунд (6.05.2010 - 11:07) web-monster написал(а):
Спасибо!
Как думаете не большое ли время заняла обработка этого запроса, мне что-то кажется что пипец долго по сравнению с остальными: 0.2985 сек

Показывает записи 0 - 29 (1448 всего, Запрос занял 0.2985 сек)
SQL-запрос:

SELECT t2.id, t2.FromUser, t2.ToUser, t1.user, t1.nick, t2.message, t1.avatar, t1.dr_day, t1.dr_month, t1.dr_year, t3.name AS gorod, t4.time
FROM anketa t1
INNER JOIN message t2 ON t2.ToUser = 'dimon'
AND t2.DelToUser = ''
AND t2.FromUser = t1.user
INNER JOIN sp_goroda t3 ON t3.id = t1.gorod
INNER JOIN online t4 ON t4.id = t1.id
ORDER BY t2.id DESC

Спустя 2 часа, 53 минуты, 13 секунд (6.05.2010 - 14:00) dr_Lev написал(а):
Попробуй по совету sergeiss сделать подзапрос :
SELECT t2.id, t2.FromUser, t2.ToUser, t1.user, t1.nick, t2.message, t1.avatar, t1.dr_day, t1.dr_month, t1.dr_year, t3.name AS gorod, t4.time
FROM anketa t1
INNER JOIN
(SELECT * FROM message WHERE ToUser = 'dimon' AND DelToUser = '') t2
ON t2.FromUser = t1.user
INNER JOIN sp_goroda t3 ON t3.id = t1.gorod
INNER JOIN online t4 ON t4.id = t1.id
ORDER BY t2.id DESC

хотя, если в таблице message не много строк, то прирост скорости будет не сильно ощутимый

Спустя 16 минут, 25 секунд (6.05.2010 - 14:16) web-monster написал(а):
методом подзапроса время выполнения: 0.36

что на 0.07 сек больше предыдущего
Быстрый ответ:

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