Mysql查询大数据表的执行时间优化

时间:2014-05-20 07:32:13

标签: php mysql

我正在执行一个mysql查询,用于从具有530399条记录的表中搜索汽车信息

执行查询需要花费很多时间

SELECT c.* FROM CarInfo as c WHERE (c.Vehicle_Year<='2014') and c.Vehicle_Age_Type='USED' limit 0,15 . 

我需要表中的所有字段,所以使用*。

我的桌子有36列。有没有办法优化此查询。

添加索引后,它会快速加载限制,但在尝试使用总计数时需要花费时间

SELECT count(*) as total FROM CarInfo as c WHERE (c.Vehicle_Year<='2014') and c.Vehicle_Dealer_Zip in(85320,85354,85541) and (c.Vehicle_age_type='New' or c.Vehicle_age_type='Used' or c.Vehicle_age_type='Certified Used')

Dealer_Zip可能包含可能值。

提前致谢。

1 个答案:

答案 0 :(得分:2)

看起来您的表缺少索引,如果是,则需要先添加它们。

在添加索引之前,首先使用以下命令检查其是否已存在

show indexes from CarInfo

从上面的命令看看Vehicle_Year和Vehicle_Age_Type是否有索引,因为你提到了查询需要优化,我猜你错过了索引。

下一步将索引添加为

alter table CarInfo add index type_year_idx (Vehicle_Age_Type,Vehicle_Year);

注意:在添加索引

之前,您必须备份表

然后将查询重新框架为

SELECT c.* 
FROM CarInfo as c 
WHERE c.Vehicle_Age_Type='USED' 
AND c.Vehicle_Year<='2014' limit 0,15 ;

此外,如果您认为查询需要很长时间,则应始终使用EXPLAIN查看此查询的内容,以便您可以计划优化。对于当前查询,语法如下所示。

EXPLAIN  
 SELECT c.* 
    FROM CarInfo as c 
    WHERE 
    c.Vehicle_Year<='2014'
    AND c.Vehicle_Age_Type='USED' 
limit 0,15 ;