2 одинаковых SQL-запроса с разными параметрами - только для одной требуется временная таблица - PullRequest
4 голосов
/ 10 октября 2010

Единственная разница в этих sql-запросах - это параметр record_id (это то, как я пролистываю весь набор результатов).Таблицы myisam.Первый запрос работает хорошо, а второй ужасно медленно.Любая идея, почему это будет?

Этот запрос отлично работает

explain select r.record_id, r.oai_datestamp, r.format_id, r.status,  x.xml,  max(u.date_updated) as date_updated 
from  marcnormalization.records r, 
   marcnormalization.records_xml x, 
   marcnormalization.record_updates u 
where r.record_id = x.record_id 
  and (r.record_id > 1802000 or 1802000 is null) 
  and r.record_id = u.record_id 
  and (u.date_updated > '1960-10-19 10:18:52.0' or '1960-10-19 10:18:52.0' is null) 
  and u.date_updated <= '2010-10-07 10:18:52.0'
group by u.record_id 
order by u.record_id 
limit 1000;

этот запрос очень медленный (создает временную таблицу)

explain select r.record_id, r.oai_datestamp, r.format_id, r.status,  x.xml,  max(u.date_updated) as date_updated 
from  marcnormalization.records r, 
   marcnormalization.records_xml x, 
   marcnormalization.record_updates u 
where r.record_id = x.record_id 
  and (r.record_id > 2202000 or 2202000 is null) 
  and r.record_id = u.record_id 
  and (u.date_updated > '1960-10-19 10:18:52.0' or '1960-10-19 10:18:52.0' is null) 
  and u.date_updated <= '2010-10-07 10:18:52.0'
group by u.record_id 
order by u.record_id 
limit 1000;

обновление: Я справился со своей проблемой, изменив с

group by u.record_id 
order by u.record_id 

на

group by r.record_id 
order by r.record_id 

Итак, сейчас это спорный вопрос, но мне все еще интереснок первоначальному вопросу.

Ответы [ 2 ]

1 голос
/ 13 октября 2010

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

mysql> select @@ max_heap_table_size;

mysql> SET SESSION max_heap_table_size = 19777216;

после этого выполните запрос.

BarisAkverdi

0 голосов
/ 11 октября 2010

А как же:

EXPLAIN
SELECT r.record_id, r.oai_datestamp, r.format_id, r.status,  x.xml,  max(u.date_updated) as date_updated 
FROM marcnormalization.records_xml x
INNER JOIN (SELECT * FROM marcnormalization.records WHERE record_id > 1802000) r
ON r.record_id = x.record_id
INNER JOIN (SELECT * FROM marcnormalization.record_updates WHERE date_updated BETWEEN '1960-10-19 10:18:52.0' AND '2010-10-07 10:18:52.0') u
ON r.record_id = u.record_id
group by u.record_id ASC
limit 1000;

Я думаю, что это может быть быстрее?

...