嵌套MySQL查询挂起

时间:2019-11-25 15:20:21

标签: mysql nested

我正在使用飞行测试数据集。

CREATE TABLE IF NOT EXISTS `flights` (
  `flightsKey` int(11) NOT NULL AUTO_INCREMENT,
  `sno` varchar(10) DEFAULT NULL,
  `year` int(4) DEFAULT NULL,
  `month` int(2) DEFAULT NULL,
  `day` varchar(10) DEFAULT NULL,
  `dep_time` int(4) DEFAULT NULL,
  `sched_dep_time` int(4) DEFAULT NULL,
  `dep_delay` int(10) DEFAULT NULL,
  `arr_time` int(4) DEFAULT NULL,
  `sched_arr_time` int(4) DEFAULT NULL,
  `arr_delay` int(10) DEFAULT NULL,
  `carrier` varchar(2) DEFAULT NULL,
  `flight` varchar(3) DEFAULT NULL,
  `tailnum` varchar(10) NOT NULL,
  `origin` varchar(3) DEFAULT NULL,
  `dest` varchar(3) DEFAULT NULL,
  `air_time` int(10) DEFAULT NULL,
  `distance` int(10) DEFAULT NULL,
  `hour` int(2) DEFAULT NULL,
  `minute` int(3) DEFAULT NULL,
  `fullDate` varchar(12) DEFAULT NULL,
  PRIMARY KEY (`flightsKey`),
  KEY `origin` (`origin`),
  KEY `carrier` (`carrier`),
  KEY `dest` (`dest`),
  KEY `tailnum` (`tailnum`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=336868 ;

--
-- Dumping data for table `flights`
--

INSERT INTO `flights` (`flightsKey`, `sno`, `year`, `month`, `day`, `dep_time`, `sched_dep_time`, `dep_delay`, `arr_time`, `sched_arr_time`, `arr_delay`, `carrier`, `flight`, `tailnum`, `origin`, `dest`, `air_time`, `distance`, `hour`, `minute`, `fullDate`) VALUES
(1, '1', 2013, 1, '1', 517, 515, 2, 830, 819, 11, 'UA', '154', 'N14228', 'EWR', 'IAH', 227, 1400, 5, 15, '0000-00-00'),
(2, '2', 2013, 1, '1', 533, 529, 4, 850, 830, 20, 'UA', '171', 'N24211', 'LGA', 'IAH', 227, 1416, 5, 29, '0000-00-00'),
(3, '3', 2013, 1, '1', 542, 540, 2, 923, 850, 33, 'AA', '114', 'N619AA', 'JFK', 'MIA', 160, 1089, 5, 40, '0000-00-00'),
(4, '4', 2013, 1, '1', 544, 545, -1, 1004, 1022, -18, 'B6', '725', 'N804JB', 'JFK', 'BQN', 183, 1576, 5, 45, '0000-00-00'),
(5, '5', 2013, 1, '1', 554, 600, -6, 812, 837, -25, 'DL', '461', 'N668DN', 'LGA', 'ATL', 116, 762, 6, 0, '0000-00-00'),
(6, '6', 2013, 1, '1', 554, 558, -4, 740, 728, 12, 'UA', '169', 'N39463', 'EWR', 'ORD', 150, 719, 5, 58, '0000-00-00'),
(7, '7', 2013, 1, '1', 555, 600, -5, 913, 854, 19, 'B6', '507', 'N516JB', 'EWR', 'FLL', 158, 1065, 6, 0, '0000-00-00'),
(8, '8', 2013, 1, '1', 557, 600, -3, 709, 723, -14, 'EV', '570', 'N829AS', 'LGA', 'IAD', 53, 229, 6, 0, '0000-00-00'),
(9, '9', 2013, 1, '1', 557, 600, -3, 838, 846, -8, 'B6', '79', 'N593JB', 'JFK', 'MCO', 140, 944, 6, 0, '0000-00-00'),
(10, '10', 2013, 1, '1', 558, 600, -2, 753, 745, 8, 'AA', '301', 'N3ALAA', 'LGA', 'ORD', 138, 733, 6, 0, '0000-00-00');

我可以通过使用视图来使查询正常工作,但是我试图找出是什么原因导致嵌套查询挂起

这没有问题。让我们称之为查询1: SELECT carrier FROM flights GROUP BY carrier HAVING COUNT(*) <5000

它产生以下列表: ('AS', 'F9','FL', 'HA', 'OO', 'YV')

这也没有问题。我们称之为查询2。

SELECT origin, AVG(dep_delay) FROM flights
WHERE carrier IN ('AS', 'F9','FL', 'HA', 'OO', 'YV')
GROUP BY origin

但是,当您在查询2的内部查询中使用查询1时,它会卡住:

SELECT origin, AVG(dep_delay) FROM flights
WHERE carrier IN (SELECT carrier FROM flights GROUP BY carrier HAVING COUNT(*) <5000)
GROUP BY origin

我也尝试过此方法,并且运行顺利。我为内部查询创建了一个视图:

CREATE view smallCarriers AS
SELECT carrier FROM flights GROUP BY carrier HAVING COUNT(*) <5000

然后我将视图用作嵌套查询中的内部查询:

SELECT origin, AVG(dep_delay) FROM flights
WHERE carrier IN (SELECT * FROM smallCarriers)
GROUP BY origin

基本上,除显式嵌套查询外,其他所有东西都起作用。 我在Ubuntu 14.04上运行Mysql版本5.5.62。我正在phpmyadmin中运行这些查询,当查询挂起时查询状态为“正在发送数据”。

我在这里包括了SQL小提琴的链接: http://sqlfiddle.com/#!9/605236/5

似乎可行-所以我的问题是为什么?

实际表有336776行。我尝试了InnoDB和MyISAM,以为建立引用完整性的方式正在发生问题,但是我仍然遇到相同的问题。该查询会导致脚本挂起怎么办? 注意-我也尝试过直接从mysql shell中以相同的结果进行查询。

我从挂起的查询中添加了EXPLAIN结果: mysql> EXPLAIN SELECT origin,AVG(dep_delay)FROM航班,WHERE承运人IN(SELECT航班,来自航班GROUP BY承运人,拥有COUNT(*)<5000)GROUP BY承运人;

+----+--------------------+---------+-------+---------------+---------+---------+------+--------+-------------+
| id | select_type        | table   | type  | possible_keys | key     | key_len | ref  | rows   | Extra       |
+----+--------------------+---------+-------+---------------+---------+---------+------+--------+-------------+
|  1 | PRIMARY            | flights | index | NULL          | origin  | 12      | NULL | 337143 | Using where |
|  2 | DEPENDENT SUBQUERY | flights | index | NULL          | carrier | 9       | NULL |  42183 | Using index |
+----+--------------------+---------+-------+---------------+---------+---------+------+--------+-------------+
2 rows in set (0.01 sec)

0 个答案:

没有答案
相关问题