mysql子查询性能

mysql子查询性能,mysql,query-optimization,subquery,Mysql,Query Optimization,Subquery,我的SQL(带子查询)耗时很长(将近24小时)。使用子查询是否不利于性能 我的桌子如下 mysql> show create table eventnew; CREATE TABLE `eventnew` ( `id` int(50) NOT NULL AUTO_INCREMENT, `date` datetime DEFAULT NULL, `src_ip` int(10) unsigned DEFAULT NULL, `src_port` int(10) unsigne

我的SQL(带子查询)耗时很长(将近24小时)。使用子查询是否不利于性能

我的桌子如下

mysql> show create table eventnew;
CREATE TABLE `eventnew` (
  `id` int(50) NOT NULL AUTO_INCREMENT,
  `date` datetime DEFAULT NULL,
  `src_ip` int(10) unsigned DEFAULT NULL,
  `src_port` int(10) unsigned DEFAULT NULL,
  `dst_ip` int(10) unsigned DEFAULT NULL,
  `dst_port` int(10) unsigned DEFAULT NULL,
  `repo_ip` varchar(50) DEFAULT NULL,
  `link` varchar(50) DEFAULT NULL,
  `binary_hash` varchar(50) DEFAULT NULL,
  `sensor_id` varchar(50) DEFAULT NULL,
  `repox_ip` int(10) unsigned DEFAULT NULL,
  `flags` varchar(50) DEFAULT NULL,
  `shellcode` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `date` (`date`),
  KEY `sensor_id` (`sensor_id`),
  KEY `src_ip` (`src_ip`)
) ENGINE=MyISAM AUTO_INCREMENT=883278 DEFAULT CHARSET=latin1
我的SQL如下所示:

SELECT COUNT( DISTINCT binary_hash ) AS cnt
FROM eventnew
WHERE DATE >=  '2010-10-16'
AND DATE <  '2010-10-17'
AND binary_hash NOT 
IN (

SELECT DISTINCT binary_hash
FROM eventnew
WHERE DATE <  '2010-10-16'
AND binary_hash IS NOT NULL
)

我建议您使用
不存在
而不是
不存在

使用子查询肯定会影响您的性能。例如,假设一个表T1有'n'记录,T2有'm'记录。当您在T1和T2上执行联接时,它将接受n*m条记录,然后将根据您的条件对它们进行排序。同样的情况也适用于关键字中的。如果子查询中有另一个约束,则会进一步降低效率。然而,在实践中无法避免使用子查询

试试这个

SELECT COUNT( DISTINCT a.binary_hash ) AS cnt
FROM eventnew a left join eventnew b on (a.binary_hash=b.binary_hash AND b.binary_hash IS NOT NULL AND b.DATE <  '2010-10-16')
WHERE a.DATE >=  '2010-10-16'
AND a.DATE <  '2010-10-17'
and  b.date is null
选择COUNT(不同的二进制散列)作为cnt
从eventnew a左连接eventnew b on(a.binary_hash=b.binary_hash,b.binary_hash不为空,b.DATE<'2010-10-16')
其中a.DATE>=“2010-10-16”
日期<'2010-10-17'
日期为空
SELECT COUNT( DISTINCT a.binary_hash ) AS cnt
FROM eventnew a left join eventnew b on (a.binary_hash=b.binary_hash AND b.binary_hash IS NOT NULL AND b.DATE <  '2010-10-16')
WHERE a.DATE >=  '2010-10-16'
AND a.DATE <  '2010-10-17'
and  b.date is null