[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация запроса
arlamar
есть следующий запрос:
SELECT sc.*, b.brand_name, m.model_name, (SELECT MIN(count) FROM search_count) as min, (SELECT MAX(count) FROM search_count) as max FROM search_count sc
LEFT JOIN brands b ON sc.brand_id=b.id
LEFT JOIN models m ON sc.model_id=m.id
работает нормально, быстро но мне кажется что селекты для мин и макс выполняются для каждой записи... то есть для 500 записей ещё 1000 селектов???

следующий расклад с переменными работает 1.5-2сек!!! страшно представить что творится с мускул сервером... и это локально!:
SELECT (@a:=MIN(count)) FROM search_count);
SELECT (@b:=MAX(count)) FROM search_count);
SELECT sc.*, b.brand_name, m.model_name, @a as min, @b as max FROM search_count sc
LEFT JOIN brands b ON sc.brand_id=b.id
LEFT JOIN models m ON sc.model_id=m.id


что посоветуют мускул гуру? есть такие тут?

есть ещё 2 варианта:
1. получить все записи и потом в цикле найти мин и макс
2. первым запросом получить записи, вторым мин и макс

спасибо.



Спустя 18 минут, 52 секунды (22.01.2010 - 13:30) glock18 написал(а):
Цитата
SELECT (@a:=MIN(count)) FROM search_count);
SELECT (@b:=MAX(count)) FROM search_count);
SELECT sc.*, b.brand_name, m.model_name, @a as min, @b as max FROM search_count sc
LEFT JOIN brands b ON sc.brand_id=b.id
LEFT JOIN models m ON sc.model_id=m.id


если так =>


SELECT MIN(sc.count), MAX(sc.count) into @a, @b FROM search_count sc;
SELECT sc.*, b.brand_name, m.model_name FROM search_count sc
LEFT JOIN brands b ON sc.brand_id=b.id
LEFT JOIN models m ON sc.model_id=m.id;
SELECT @a as `min`, @b as `max`;


+ покажи explain. если нет индекса по count нет, добавь. еще покажи create table для каждой из трех таблиц.

Спустя 19 минут, 43 секунды (22.01.2010 - 13:49) arlamar написал(а):
индекс создал
вот explain:
SELECT MIN( sc.count ) , MAX( sc.count )
INTO @a , @b
FROM search_count sc;# Затронутые ряды:1
SELECT sc . * , b.brand_name, m.model_name
FROM search_count sc
LEFT JOIN brands b ON sc.brand_id = b.id
LEFT JOIN models m ON sc.model_id = m.id;# Ряды: 3
EXPLAIN SELECT @a AS `min` , @b AS `max` ;# Ряды: 1
сам запрос отдаёт только мин и макс.

create table:
CREATE TABLE `search_count` (
`id` int(11) NOT NULL auto_increment,
`brand_id` int(11) NOT NULL,
`model_id` int(11) NOT NULL,
`count` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `count` (`count`)
)
ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=11 ;

CREATE TABLE `brands` (
`id` int(11) NOT NULL auto_increment,
`brand_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;

CREATE TABLE `models` (
`id` int(11) NOT NULL auto_increment,
`bid` int(11) NOT NULL,
`model_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=23 ;

Спустя 14 минут, 33 секунды (22.01.2010 - 14:04) glock18 написал(а):
arlamar
это не explain, а то же самое что я дал, только с ключевым словом explain.

второй и третий запрос надо выполнять и разбирать последовательно.

Спустя 1 минута, 47 секунд (22.01.2010 - 14:06) arlamar написал(а):
glock18
как сделать правильный explain? )

Спустя 4 минуты, 26 секунд (22.01.2010 - 14:10) glock18 написал(а):
выполнить explain и сюда результат

Спустя 6 минут, 19 секунд (22.01.2010 - 14:16) arlamar написал(а):
explain select * from search_count показывает табличку с кучей непонятной для меня инфы

а в случае когда 2,3 запроса explain не пашет
писал его перед всеми select, писал по очереди и только если перед последним select'ом вписать explain тогда он дописывает в запрос сколько рядов затронуто

может дело в phpMyAdmin?

Спустя 4 минуты, 15 секунд (22.01.2010 - 14:21) glock18 написал(а):
Цитата (arlamar @ 22.01.2010 - 11:16)
explain select * from search_count показывает табличку с кучей непонятной для меня инфы


эту инфу и надо. только не этого запроса, а этого

SELECT sc.*, b.brand_name, m.model_name FROM search_count sc
LEFT JOIN brands b ON sc.brand_id=b.id
LEFT JOIN models m ON sc.model_id=m.id;

Спустя 4 минуты, 17 секунд (22.01.2010 - 14:25) arlamar написал(а):
вот:
user posted image

Спустя 10 минут, 29 секунд (22.01.2010 - 14:35) glock18 написал(а):
и так, запрос будет выполняться. чтобы можно было сравнить запости те explain'ы еще для запросов которые ты до этого пробовал.

но и без этого могу сказать, что нужно выбирать именно так. max, min одним запросом, данные другим.

Спустя 4 минуты, 39 секунд (22.01.2010 - 14:40) arlamar написал(а):
угу, я тоже по скорости выполнения понял уже что это оптимальный вариант.
теперь встал другой вопрос почему то phpMyAdmin выполняет
SELECT MIN(count), MAX(count) INTO @a, @b FROM search_count;
SELECT sc.*,
b.brand_name,
m.model_name,
SUM(sc.count) as count,
@a as min,
@b as max
FROM search_count sc
LEFT JOIN brands b ON sc.brand_id=b.id
LEFT JOIN models m ON sc.model_id=m.id
GROUP BY sc.brand_id, sc.model_id

а мой скрипт говорит ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; SELECT sc.*, b.brand_name, m.model_name, SUM(sc.count' at line 1

Спустя 8 часов, 52 минуты, 59 секунд (22.01.2010 - 23:33) vagrand написал(а):
если ты запихнул все эти запросы в один mysql_query() то это неправильно, ибо он может одновременно выполнить только один запрос
Быстрый ответ:

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