Forum Webscript.Ru

Программирование => Perl => Тема начата: Error202 от 02 Февраля 2006, 12:35:44

Название: Запрос к MySQL - 15 секунд!
Отправлено: Error202 от 02 Февраля 2006, 12:35:44
В одной таблице (b) - 5000 записей
В другой (a) - 1500 записей

Почему запрос выполняется 15 секунд?


$sth = $dbh->prepare(qq{ SELECT a.id FROM rw_unrec as a, rw_rec as b WHERE (a.url=b.url) OR (a.email=b.email)});  
$sth->execute();
while (($did) = $sth->fetchrow_array())
  {
    $DubID{$did}=\'dub\';
  };
$sth->finish();
Название: Запрос к MySQL - 15 секунд!
Отправлено: Меняздесьдавнонет от 02 Февраля 2006, 12:39:24
потому, что 5000х1500=7500000
Название: Запрос к MySQL - 15 секунд!
Отправлено: Error202 от 02 Февраля 2006, 12:41:58
Чего можно с этим сделать?

Просто задача сравнить урл и емаил в 2-х таблицах, и если вдруг они совпадают, вписать id записи табл.А в хэш...
Название: Запрос к MySQL - 15 секунд!
Отправлено: AnnA от 02 Февраля 2006, 12:52:13
на мой взгляд - неоправданная конструкция: ($did) = $sth->fetchrow_array()
1. вас интересует всего одно значение - a.id зачем вам array?
2. вы дублируете данные в памяти. следует использовать функцию с *ref
selectrow_hashref например
но, возможно и не получится получить заметное преимущество во времени.
надо пробовать. ;)
Название: Запрос к MySQL - 15 секунд!
Отправлено: Error202 от 02 Февраля 2006, 12:58:55
В среднем 12-14 секунд.. :(
Название: Запрос к MySQL - 15 секунд!
Отправлено: Error202 от 02 Февраля 2006, 13:29:47
Всем спасибо! Обошелся без этого запроса...
Название: Запрос к MySQL - 15 секунд!
Отправлено: ondr от 02 Февраля 2006, 13:32:53
Error202
читай документацию mysql в разделе "Оптимизация в MySQL" (а лучше и остальные разделы тоже). Расставляй индексы, обрати внимание на типы сверяемых полей, проверяй и корректируй запрос c помощью explain
Название: Запрос к MySQL - 15 секунд!
Отправлено: ondr от 02 Февраля 2006, 13:37:47
Error202 в догонку

from prerldoc DBI:
---
When all the data has been fetched from a C