|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
32104
|
|