SQL сложный запрос

meri

Вопрос посвящен он обновлению базы поисковика.
есть два варианта написания одной фазы обновления

sprintf(szSQL, "INSERT IGNORE INTO db%uname(name,hash) "
"SELECT name, hash FROM scantmp WHERE serv=%u AND type=%u",i,serv,i);
database.safe_query(szSQL);
sprintf(szSQL, "INSERT INTO db%uloc(fid,size,loc,serv) "
"SELECT db%uname.fid,size,loc,serv FROM scantmp LEFT JOIN db%uname ON(scantmp.name=db%uname.name) "
"WHERE serv=%u AND type=%u ", i,i,i,i,serv,i);
database.safe_query(szSQL);


то есть сначала заносим в базу имен те имена файлов которых в ней еще нет,
а потом, уверенные в том, что все имена файлов присутствуют в базе
обновляем список расшарки.
Второй вариант

sprintf(szSQL, "UPDATE scantmp LEFT JOIN db%uname ON (db%uname.name=scantmp.name) "
"SET scantmp.fid=db%uname.fid "
"WHERE scantmp.serv=%u AND scantmp.type=%u",
i,i,i,serv,i);
database.safe_query(szSQL);
if(typeCnt[i]!=mysql_affected_rows(database.mySQL{
sprintf(szSQL, "INSERT IGNORE INTO db%uname(name,hash) "
"SELECT name, hash FROM scantmp WHERE serv=%u AND type=%u AND fid=0",i,serv,i);
database.safe_query(szSQL);
sprintf(szSQL, "UPDATE scantmp LEFT JOIN db%uname ON (db%uname.name=scantmp.name) "
"SET scantmp.fid=db%uname.fid "
"WHERE scantmp.serv=%u AND scantmp.type=%u AND scantmp.fid=0",
i,i,i,serv,i);
database.safe_query(szSQL);
}
sprintf(szSQL, "INSERT INTO db%uloc(fid,size,loc,serv) "
"SELECT fid,size,loc,serv FROM scantmp "
"WHERE serv=%u AND type=%u ", i,serv,i);
database.safe_query(szSQL);


С точки зрения логики(моей) второй код должен выполняться быстрее.
В первом мы два раза производим поиск имени в базе, когда пытаемся
добавить в нее новое имя и при обновлении расшарки.
Во втором коде только один раз происходит поиск по имени ресурса.
(опустим кеширование)
На практике получается, что первый код быстрее второго работает!
Что я делаю неправильно?
// Alex3D

stm7884696

на практике выполняется тот код, который меньше... (в данном варианте)
ИМХО -джоинить надо меньше..... вроде как при джойне сначала перебирает всю таблицу и джоинит,Э а потом основной запрос делает...

sergei1969

возьми какую-нить тулзу (в зависимости от того, какая база) которой можно посмотреть план запроса и всё узнаешь
Оставить комментарий
Имя или ник:
Комментарий: