我的应用程序中有以下查询:
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秒)。我有关于flight_date,flight_number,机场,航空公司和计划的索引。
仍然,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
我必须创建哪些索引,我缺少什么?
答案 0 :(得分: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)
答案 1 :(得分:1)
由于历史原因,MySQL每个参与表只能使用一个索引。在您的查询中,仅引用了表flights_database
和airports
,因此它可以使用恰好2个索引。更好地计算它们:))
您需要在现有的单列索引之上定义一些多列索引,专门针对慢速查询进行微调。不要过分担心负面性能影响,它只会减慢操作速度,并极大地增强读取操作。设置索引,使它们首先提供最通用的过滤器(可能首先在airport
,然后向下到其他过滤器和排序标准。
对于flights_database
,您可能需要(airport, airline, flight_number, flight_date)
上的索引。它应该立即大大改善查询时间。