помогите объединить два запроса!

QuadMan

Новичок
помогите объединить два запроса!

Подскажите, пожалуйста.. smile.gif
Чувствую, что все просто, но... башка уже не варит.
Есть таблица с полями CTYPE = enum ('C','P','R') и CDATE = DATETIME, покрывающим индексом по полям (CTYPE,CDATE) и отдельный индекс по CTYPE. Записей - около 10000.

Есть запрос:
(1) SELECT * FROM `TAB1` WHERE `CTYPE`='C' ORDER BY `CDATE` LIMIT 100
(2) SELECT * FROM `TAB1` WHERE `CTYPE`='P' ORDER BY `CDATE` LIMIT 100
каждый из этих запросов выполняется очень быстро 0.0015 сек

хочу объединить эти запросы в один
SELECT * FROM `TAB1` WHERE `CTYPE` IN ('C',P') ORDER BY `CDATE` LIMIT 100 - выполняется в 40!!! раз медленнее!!! EXPLAIN пишет в поле extra - using filesort. Похоже проблема в этом...
попробовал переписать с UNION:
EXPLAIN SELECT * FROM `TAB1` WHERE `CTYPE`='C'
UNION ALL
SELECT * FROM `TAB1` WHERE `CTYPE`='P' ORDER BY `CDATE` LIMIT 100, но в скорости тоже не выиграл, using filesort остался... выполняется тоже медленно.

помогите советом, пожалуйста, как эти два запроса объединить в один без такой потери в скорости! smile.gif

ЗЫ. можно, конечно, выкрутиться так: SELECT * FROM `TAB1` WHERE `CTYPE`<>'R' ORDER BY `CDATE` LIMIT 100, но это лишь частный случай, а хотелось бы узнать решение для более общего случая

спасибо
 

Gas

может по одной?
покажи _реальный_ запрос c union'ом и его explain
 

QuadMan

Новичок
Автор оригинала: Gas
покажи _реальный_ запрос c union'ом и его explain
Запрос:
PHP:
EXPLAIN SELECT *
FROM `CALENDARS`
WHERE `CTYPE` = 'C'
UNION ALL
SELECT *
FROM `CALENDARS`
WHERE `CTYPE` = 'P'
ORDER BY `CDATE`
LIMIT 100
PHP:
EXPLAIN:
id  	 select_type  	 table  	 type  	 possible_keys  	 key  	 key_len  	 ref  	 rows  	 Extra
1 	PRIMARY 	CALENDARS 	ref 	CTYPE_2 	CTYPE_2 	2 	const 	3461 	Using where
2 	UNION 	CALENDARS 	ref 	CTYPE_2 	CTYPE_2 	2 	const 	3461 	Using where
NULL 	UNION RESULT 	<union1,2> 	ALL 	NULL 	NULL 	NULL 	NULL 	NULL 	Using filesort
 

Gas

может по одной?
У тебя в запросе выбираются во временную таблицу 3461 записей для `CTYPE` = 'C' и столько же для `CTYPE` = 'P', потом объединяются и сортируются все 6920 записей (без индексов). А ты сделай как и писал:
(1) SELECT * FROM `TAB1` WHERE `CTYPE`='C' ORDER BY `CDATE` LIMIT 100
(2) SELECT * FROM `TAB1` WHERE `CTYPE`='P' ORDER BY `CDATE` LIMIT 100
и уже потом сортируй 200 записей, а не 6900
 

QuadMan

Новичок
Автор оригинала: Gas
У тебя в запросе выбираются во временную таблицу 3461 записей для `CTYPE` = 'C' и столько же для `CTYPE` = 'P', потом объединяются и сортируются все 6920 записей (без индексов). А ты сделай как и писал:
и уже потом сортируй 200 записей, а не 6900
да, это понятно. .вот я и не смог написать так, чтобы сделать это в одном запросе... перед UNION ALL нельзя же ставить ORDER BY... получается только 2 запроса.. или я что-то не догоняю :(
 
Сверху