查询不使用正确的索引,慢

时间:2013-05-26 19:31:09

标签: mysql join database-indexes

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

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

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

2 个答案:

答案 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_databaseairports,因此它可以使用恰好2个索引。更好地计算它们:))

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

对于flights_database,您可能需要(airport, airline, flight_number, flight_date)上的索引。它应该立即大大改善查询时间。