0 レビュー
1 回答
php-長いクエリ用にApache、PHP5 FPM、MySQLを設定する
次のクエリがあります:
SELECT SQL_CALC_FOUND_ROWS
a.`id_order`,`reference`,`total_paid_tax_incl`,
`payment`,a.date_add as date_add,
a.id_currency, a.id_order AS id_pdf,
CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`,
osl.`name` AS `osname`, os.`color`,
IF((SELECT COUNT(so.id_order) FROM `ps_orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new,
IF(om.`erp_order_id` is null, 0, 1) as erp_id
FROM `ps_orders` a
LEFT JOIN `ps_customer` c ON (c.`id_customer` = a.`id_customer`)
LEFT JOIN `ps_order_state` os ON (os.`id_order_state` = a.`current_state`)
LEFT JOIN `ps_order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1)
LEFT JOIN `ps_order_merge` om ON (om.`prst_order_id` = a.`id_order`)
WHERE 1
ORDER BY a.id_order DESC LIMIT 0,50;
読み込みに約160秒かかりました。このクエリは非常に特定のページで呼び出されます(実際には、1つの特定のページからのみ呼び出されます)。次のURLがそのようなクエリを実行すると仮定しましょう:
http://example.com/some/url/query.php
そのクエリを呼び出すと、ブラウザに表示されます
'500 Internal Server Error'
さらにデバッグすると、ログから次の情報が得られます。
Wed Mar 30 01:22:43.780576 2016] [fastcgi:error] [pid 12345:tid 1234567890] [client 123.459.78.123:12345] FastCGI: incomplete headers (0 bytes) received from server "/path/to/php5-fcgi", referer: http://example.com/some/file.php
そしてFPMの遅いログはこれを示しています:
script_filename = /path/to/some/script.php
[0x00007f55bb18afd8] query() /path/to/some/script/DbPDO.php:80
[0x00007f55bb18aef8] _query() /path/to/some/script/Db.php:305
[0x00007f55bb18ad88] query() /path/to/some/script/Db.php:482
[0x00007f55bb18ab68] executeS() /path/to/some/script/AdminController.php:2198
[0x00007f55bb18a9e8] getList() /path/to/some/script/AdminController.php:1531
[0x00007f55bb18a8d0] renderList() /path/to/some/script/AdminController.php:1440
[0x00007f55bb18a788] initContent() /path/to/some/script/Controller.php:167
[0x00007f55bb18a5d0] run() /path/to/some/script/Dispatcher.php:349
[0x00007f55bb18a480] dispatch() /path/to/some/script/index.php:50
これは、クエリを実行する正確なファイルと行です:
[0x00007f55bb18ab68] executeS() /path/to/some/script/AdminController.php:2198
apache/php5-fpmが少なくとも160秒待機するようにタイムアウトを延長する方法を知りたいです。そのため、少なくとも今のところは、問題のあるページを読み込むことができます。
すでにphp.iniを設定しています:
mysql.allow_persistent = On
mysql.connect_timeout = 160
編集1
クエリを変更することは許可されておらず、アクセスもできません。
わからない
0
レビュー
答え :
解決策:
自分の問題の解決策を見つけましたが、LEFTJOINEDテーブルの1つが適切にインデックス付けされていないことに気づきました。
このテーブルのインデックスを作成しました:
LEFT JOIN `ps_order_merge`
そして、クエリははるかに高速に実行されます(1秒未満)。
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。