Запрос длится много времени в некоторых новых версиях MySQL

dba.stackexchange https://dba.stackexchange.com/questions/6526

Вопрос

Я создал базу данных на 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 столбцов.

Объясните результатenter image description here

показать переменные, такие как результат 'Innodb%'

enter image description here

Это было полезно?

Решение

Недавно новые версии 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 вне коробки без надлежащей конфигурации Как получить Lamborghini и ожидание высоких показателей на галлоне обычного бензина (87 октана).

Вы должны ожидать Лучшая производительность с высоким октановым бензином в Lamborghini.

Как и в случае с любым продуктом базы данных, он настолько же повышен в производительности, как и вы его настраиваете. Так же, как сказал Человек -паук (8:36 - 8:40): «С великой силой, также всегда должна быть большая ответственность».

Чтобы получить лучшую производительность из MySQL 5.5, вы должны честно настроить определенные вещи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top