我使用的是MySQL 5.5.14版,从500万行的表中运行以下查询:
SELECT P.ID, P.Type, P.Name, P.cty
, X(P.latlng) as 'lat', Y(P.latlng) as 'lng'
, P.cur, P.ak, P.tn, P.St, P.Tm, P.flA, P.ldA, P.flN
, P.lv, P.bd, P.bt, P.nb
, P.ak * E.usD as 'usP'
FROM PIG P
INNER JOIN EEL E
ON E.cur = P.cur
WHERE act='1'
AND flA >= '1615'
AND ldA >= '0'
AND yr >= (YEAR(NOW()) - 100)
AND lv >= '0'
AND bd >= '3'
AND bt >= '2'
AND nb <= '5'
AND cDate >= NOW()
AND MBRContains(LineString( Point(-65.6583, -87.8906)
, Point(65.6583, 87.8906)
), latlng)
AND Type = 'g'
AND tn = 'l'
AND St + Tm - YEAR(NOW()) >= '30'
HAVING usP BETWEEN 300/2 AND 300 LIMIT 100;
第一次,花了313s,第二次花了48s,第三次花了101s。来自explain select,查询计划的类型为:range; key:index和extra:使用表P上的where,然后键入:eq_ref和key:primary on table E.此查询不使用查询缓存。我的问题是:“为什么查询时间如此显着不同?”
干杯, 本
答案 0 :(得分:1)
在分析查询时使用SQL_NO_CACHE
:
SELECT SQL_NO_CACHE P.ID, P.Type, ...
在第二次运行中花费较少时间的原因是MySQL已缓存查询结果。
SQL_NO_CACHE禁用此查询的缓存。您可以使用FLUSH QUERY CACHE
清除查询缓存。