查询在一些较新的MySQL版本中运行很长时间
题
我已经在MySQL 5.0.15上创建了一个数据库。我有一个查询,当我在此MySQL版本上运行此查询时,我的运行时间为0.9。当我使用相同的硬件将此数据库导入另一台MySQL服务器并运行相同的查询时,我会超过120秒,有时会挂起MySQL。
5.0和5.1或5.5之间有什么区别?我已经测试了5.1和5.5版。
在较新版本中,查询是否可能需要更长的时间(类似MySQL结构更改)?
抱歉,我无法将此查询放在这里,但是查询就像:
SELECT fl_passenger_ticket. *,
fl_aganc.name AS agancname,
fl_pnr.remark AS remark,
fl_pnr.reservetime AS reservetime,
fl_pnr.cancelpnr,
fl_flight_date.fromcity AS fromcity,
fl_flight_date.tocity AS tocity,
fl_flight_date.flightdate AS flightdate,
fl_flightdate_capacity.adultper AS adultper,
fl_flightdate_capacity.childper AS childper,
fl_flightdate_capacity.infantper AS infantper,
fl_flightdate_capacity.cancel AS cancelsegment,
fl_flightdate_capacity.tax1adultpric,
fl_flightdate_capacity.tax1childpric,
fl_flightdate_capacity.tax1infantpric,
fl_flightdate_capacity.tax2adultpric,
fl_flightdate_capacity.tax2childpric,
fl_flightdate_capacity.tax2infantpric,
( fl_flightdate_capacity.tax3adultpric +
fl_flightdate_capacity.tax4adultpric +
fl_flightdate_capacity.tax5adultpric ) AS taxxtadultpric,
( fl_flightdate_capacity.tax3childpric +
fl_flightdate_capacity.tax4childpric +
fl_flightdate_capacity.tax5childpric ) AS taxxtchildpric,
( fl_flightdate_capacity.tax3infantpric +
fl_flightdate_capacity.tax4infantpric
+
fl_flightdate_capacity.tax5infantpric ) AS taxxtinfantpric
FROM fl_passenger_ticket
INNER JOIN fl_pnr
ON ( fl_passenger_ticket.pnrid = fl_pnr.pnrid )
INNER JOIN fl_aganc
ON ( fl_pnr.agancid = fl_aganc.agancid )
LEFT JOIN fl_flightdate_capacity
ON ( fl_pnr.pnrid = fl_flightdate_capacity.pnrid )
LEFT JOIN fl_flight_date
ON ( fl_flightdate_capacity.flightdateid = fl_flight_date.flightdateid
)
WHERE fl_passenger_ticket.ticketnumber <> ''
AND fl_passenger_ticket.pnrid <> 0
AND fl_pnr.agancid = 60
AND fl_flightdate_capacity.aganccharterid = 0
AND fl_flightdate_capacity.cancel IN ( 0, 1 )
AND fl_pnr.reservetime >= '2011/09/01 00:00:00'
AND fl_pnr.reservetime <= '2011/09/19 23:59:00'
ORDER BY fl_passenger_ticket.rowid,
fl_pnr.reservetime
我有4个加入。
桌子是Innodb。
有100000记录
结果是100行和50列。
解释结果是
显示“ InnoDB%”结果之类的变量
解决方案
就在蝙蝠之外,MySQL的新版本实际上改善了InnoDB的性能(尤其是5.5)。如果您要运行InnoDB,我强烈建议您更新此版本。
您可以使用一种方法来寻找为什么要花费更长的时间使用的方法 mysql配置文件
mysql> SET PROFILING=1;
mysql> SHOW TABLES;
mysql> SELECT * FROM foo;
mysql> SET PROFILING=0;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW PROFILES;
+----------+------------+-------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------+
| 1 | 0.09270400 | SHOW TABLES |
| 2 | 0.00026400 | SELECT * FROM foo |
+----------+------------+-------------------+
2 rows in set (0.05 sec)
mysql> SHOW PROFILE FOR QUERY 2;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000053 |
| checking permissions | 0.000009 |
| Opening tables | 0.000032 |
| System lock | 0.000010 |
| init | 0.000028 |
| optimizing | 0.000003 |
| statistics | 0.000012 |
| preparing | 0.000008 |
| executing | 0.000003 |
| Sending data | 0.000068 |
| end | 0.000004 |
| query end | 0.000007 |
| closing tables | 0.000008 |
| freeing items | 0.000013 |
| logging slow query | 0.000003 |
| cleaning up | 0.000003 |
+----------------------+----------+
16 rows in set (0.04 sec)
这应该给您指示它的位置。从您的解释输出中,您应该尝试在第二和第三表上获得一些索引,而不是进行全表扫描。但是,如果没有DDL或实际的联接列,我就不能比研究索引策略更好。
其他提示
在没有正确配置的情况下使用MySQL 5.5开箱即用的是 就像获得兰博基尼,并期望在加仑的常规汽油(87辛烷值)上表现出色。
你应该期望 兰博基尼高辛烷值汽油的表现更好.
与任何数据库产品一样,它仅与您实际配置一样具有性能增强。 就像蜘蛛侠所说的那样(8:36-8:40):“凭借强大的力量,也必须总是承担着巨大的责任”.
为了从MySQL 5.5中获得更好的性能,您必须诚实地配置某些东西。
选项2: 配置可以参与更多CPU的选项
选项3: 增加专门用于阅读和写入的线程数量
选项4: 正确调整InnoDB选项
选项6: 使用o_direct进行InnoDB冲洗
选项7:使用专用的DB服务器,除了LAMP,WAMP,XAMPP,MUNIN以及类似的软件。