Новости
Документация
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



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 млн строк?



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

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

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



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