我正在使用飞行测试数据集。
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)