查询在一些较新的 MySQL 版本中运行时间较长

use*_*731 6 mysql innodb mysql-5.5 mysql-5.1 mysql-5.0

我在 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 
Run Code Online (Sandbox Code Playgroud)
  • 我有 4 个连接。

  • 该表是innodb。

  • 有 100000 条记录

结果是 100 行和 50 列。

解释结果是 在此处输入图片说明

显示变量,如 'innodb%' 结果

在此处输入图片说明

Der*_*ney 10

很快,新版本的 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)
Run Code Online (Sandbox Code Playgroud)

这应该给你一个指示它挂在哪里。从您的解释输出中,您应该尝试在第二个和第三个表上建立一些索引,而不是进行全表扫描。但是如果没有 DDL 或实际的连接列,我不能建议比研究索引策略更好的方法。


Rol*_*DBA 8

在没有适当配置的情况下使用开箱即用的 MySQL 5.5就像购买兰博基尼并期望在一加仑普通汽油(87 Octane)上获得一流的性能。

您应该期待在兰博基尼中使用高辛烷值汽油会有更好的性能

与任何数据库产品一样,它的性能增强与您实际配置的一样。就像蜘蛛侠说的(8:36 - 8:40):“拥有强大的力量,也必须始终有很大的责任感”

为了从 MySQL 5.5 中获得更好的性能,您必须诚实地配置某些东西。