【问题标题】:mysql sub queries performancemysql子查询性能
【发布时间】:2011-10-13 02:48:11
【问题描述】:

我的 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
)

以下是运行结果说明:

+----+--------------------+----------+-------+---------------+------+---------+------+--------+-------------+
| id | select_type        | table    | type  | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+--------------------+----------+-------+---------------+------+---------+------+--------+-------------+
|  1 | PRIMARY            | eventnew | range | date          | date | 9       | NULL |  14296 | Using where |
|  2 | DEPENDENT SUBQUERY | eventnew | range | date          | date | 9       | NULL | 384974 | Using where |
+----+--------------------+----------+-------+---------------+------+---------+------+--------+-------------+

【问题讨论】:

    标签: mysql query-optimization subquery


    【解决方案1】:

    试试这个

    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
    

    【讨论】:

      【解决方案2】:

      使用子查询确实会影响您的性能。例如,假设表 T1 有 'n' 条记录,而 T2 有 'm' 条记录。当您在 T1 和 T2 上进行连接时,它将获取 n*m 条记录,然后根据您的条件对它们进行排序。 in 关键字也是如此。如果您在子查询中有另一个约束,则会进一步降低效率。然而,在实践中使用子查询是不可避免的。

      【讨论】:

        【解决方案3】:

        我建议你使用NOT EXISTS 而不是NOT IN

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-09
          • 1970-01-01
          • 2011-05-06
          • 2011-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多