Запрос длится много времени в некоторых новых версиях 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 вне коробки без надлежащей конфигурации Как получить Lamborghini и ожидание высоких показателей на галлоне обычного бензина (87 октана).
Вы должны ожидать Лучшая производительность с высоким октановым бензином в Lamborghini.
Как и в случае с любым продуктом базы данных, он настолько же повышен в производительности, как и вы его настраиваете. Так же, как сказал Человек -паук (8:36 - 8:40): «С великой силой, также всегда должна быть большая ответственность».
Чтобы получить лучшую производительность из MySQL 5.5, вы должны честно настроить определенные вещи.
ОПЦИЯ 1 : Используйте отдельные табличные файлы для InnoDB, разделяя данные и индексные страницы от IBDATA1
Вариант 2: Настройка параметров, которые привлекают больше процессоров
Вариант 3: Увеличьте количество потоков, посвященных чтениям и записям
Вариант 4: Настройка параметров Innodb
Вариант 6: Используйте O_Direct для промывки Innodb
Вариант 7: Используйте выделенный сервер DB, кроме LAMP, WAMP, XAMPP, MUNIN и подобного программного обеспечения.