Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Выбрать отсутсвующие строки (Markus) 28/08/2007 - 14:45:57
      Re: Выбрать отсутсвующие строки (EuGen) 29/08/2007 - 13:52:20
      Re: Выбрать отсутсвующие строки (Markus) 30/08/2007 - 08:26:07

> Original message text:
> From: Markus - 28/08/2007 - 14:45:57
> Subject:Выбрать отсутсвующие строки
> -----------------
> Имеем 3 таблицы.
> CREATE TABLE `sites` (
> `siteID` mediumint(6) unsigned NOT NULL auto_increment,
> `status` enum('deleted','inmoder','nomoder','blocked','active') NOT NULL default 'inmoder',
> `activateTIME` bigint(12) unsigned NOT NULL default '0',
> PRIMARY KEY (`siteID`),
> KEY `status` (`status`,`activateTIME`)
> ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=21 ;
>
>
> CREATE TABLE `ordering` (
> `domaneID` smallint(5) unsigned NOT NULL default '0',
> `siteID` mediumint(6) unsigned NOT NULL default '0',
> `variantID` mediumint(8) unsigned NOT NULL default '0',
> `ordering` mediumint(6) unsigned NOT NULL default '0',
> KEY `domaneID` (`domaneID`),
> KEY `siteID` (`siteID`)
> ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
>
> CREATE TABLE `variants` (
> `variantID` mediumint(8) unsigned NOT NULL auto_increment,
> `siteID` mediumint(6) unsigned NOT NULL default '0',
> `descVARIANT` text NOT NULL,
> PRIMARY KEY (`variantID`),
> KEY `siteID` (`siteID`)
> ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
>
> Нужно выбрать из таблицы sites строки для которых activateTIME>N, status=active, siteID!=NN,
> которых нет в таблице ordering. В таблице ordering искать только в строках где domaneID = NNN.
> К тому же надо выбрать из таблици variants строки у которых siteID совпадает с siteID таблицы sites.
>
> Вот два запроса:
>
> SELECT `s`.`siteID`,`d`.`variantID`
> FROM `sites` AS `s` USE INDEX(PRIMARY,status)
> LEFT JOIN `ordering` AS `o` ON `o`.`domaneID` = '1' AND `s`.`siteID`=`o`.`siteID`
> LEFT JOIN `variants` AS `d` ON `d`.`siteID` = `s`.`siteID`
> WHERE `s`.`activateTIME`>'1188292710' AND `s`.`status`='active' AND `s`.`siteID`!='19' AND `o`.`siteID` IS NULL
>
> и
>
> SELECT `s`.`siteID`,`d`.`variantID`
> FROM `sites` AS `s`
> LEFT JOIN `variants` AS `d` ON `d`.`siteID` = `s`.`siteID`
> WHERE `s`.`activateTIME`>'1188292710' AND `s`.`status`='active' AND `s`.`siteID`!='19'
> AND `s`.`siteID` NOT
> IN (
> SELECT `o`.`siteID`
> FROM `ordering` AS `o`
> WHERE `o`.`domaneID` = '1'
> )
>
> Вопрос на засыпку :). Какой из этих запросов будет работать быстрее с учетом того, что в sites может быть 20-30 тысяч строк,
> в таблице ordering больше 90млн строк, и в таблице variants больше 3.5 млн строк?
>
>


From: EuGen - 29/08/2007 - 13:52:20
Subject:Выбрать отсутсвующие строки
-----------------
Советую в таких случаях использовать EXPLAIN SELECT ...


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
32104



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |