0

我的应用程序中有以下查询:

SELECT a.*, f.*
FROM flights_database f 
JOIN airports a ON f.airport = a.airportNameClean
WHERE f.flight_date > CURDATE()-30
AND (f.flight_number LIKE 'New York%' OR f.airport LIKE 'New York%' OR f.airline LIKE 'New York%' OR a.iata = 'New York') 
ORDER by f.flight_date DESC, f.scheme DESC 
LIMIT 200

执行时间过长(超过 2 秒)。我有关于航班日期、航班号、机场、航空公司和计划的索引。

尽管如此,EXPLAIN 仍报告以下内容:

1
SIMPLE
f
ALL
flight_number,airport,airline,flight_date,auto_suggest,suggest_daily,flight_search
NULL
NULL
NULL
1408614
Using where; Using filesort

1
SIMPLE
a
ref
PRIMARY,airportNameClean
airportNameClean
107
my_db.f.airport
1
Using where

我必须创建哪些索引,我缺少什么?

4

2 回答 2

1

尝试这个

 SELECT a.*, f.*
 FROM flights_database f 
 JOIN airports a ON f.airport = a.airportNameClean
 WHERE f.flight_number LIKE 'New York%' OR f.airport LIKE 'New York%' OR f.airline LIKE 'New York%' OR a.iata LIKE 'New York%'
 HAVING f.flight_date > DATE_SUB(NOW(), INTERVAL 30 DAY)
 ORDER by f.flight_date DESC, f.scheme DESC 
 LIMIT 200

做这个索引:

ALTER TABLE flights_database ADD INDEX myindex (`flight_number`,airport,airline)
于 2013-05-26T19:36:31.120 回答
1

由于历史原因,MySQL每个参与表只能使用一个索引。在您的查询中,只有表flights_databaseairports被引用,因此它可以使用正好 2 个索引。最好让他们数数:)

您需要在现有的单列索引之上定义一些多列索引,专门针对慢速查询进行微调。不要太担心负面性能影响,它只会减慢操作速度,并极大地增强读取操作。设置索引,以便它们首先提供最通用的过滤器(可能airport首先提供,然后一直到其他过滤器和排序标准。

因为flights_database你可能想要一个关于(airport, airline, flight_number, flight_date). 它应该会立即大大改善查询时间。

于 2013-05-26T19:37:02.147 回答