Производительность подзапросов mysql - PullRequest
1 голос
/ 26 июля 2011

мой 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
)

ниже - результат выполнения EXPLAIN

+----+--------------------+----------+-------+---------------+------+---------+------+--------+-------------+
| 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 |
+----+--------------------+----------+-------+---------------+------+---------+------+--------+-------------+

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Использование подзапросов, безусловно, влияет на вашу производительность. Например, предположим, что таблица T1 имеет 'n' записей, а T2 имеет 'm' записей. когда вы выполняете объединение на T1 и T2, оно займет n * m записей, а затем отсортирует их в зависимости от вашего состояния. То же самое относится и к ключевому слову в . и если у вас есть другое ограничение в подзапросе, это еще больше снизит эффективность. Тем не менее, использование подзапросов не может быть предотвращено на практике, как они должны быть.

0 голосов
/ 26 июля 2011

Попробуйте это

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
0 голосов
/ 26 июля 2011

Я бы посоветовал вам использовать NOT EXISTS вместо NOT IN.

...