2

大規模な php アプリケーションがあり、遅い sql クエリをデバッグしようとしています。実際に sql クエリを呼び出したファイルを次のように自動コメントする機能が必要です。

"select /* filename.php line 234*/ `ID`,`Email`, `NickName`, `AlertBusiness`,`City` from People where ?=? and limit ?,?"

/* filename.php 行 234*/ が動的に挿入されます。おそらく

PHP には、http://php.net/manual/en/function.debug-print-backtrace.php という debug_backtrace があります

手動で行うことができます:

<?php

$query = sprintf("INSERT INTO EventLog (Trace) VALUES ('%s')",
    mysql_real_escape_string(join("\n", debug_backtrace())) );
mysql_query($query);

?>

しかし、db ドライバーのような、より中心的なものを期待していました。

MediaWiki にも同様の機能があります。 http://www.mediawiki.org/wiki/Manual:How_to_debug

You can also enable backtrace on SQL error by setting $wgShowDBErrorBacktrace:

$wgShowDBErrorBacktrace = true;"

PDOドライバーにはダンプステートメントがありますが、それはクエリにすぎず、誰がそれを呼び出したかではありません http://php.net/manual/en/pdostatement.debugdumpparams.php

それを実行しているphpページのコンテキストでSQLを最適にデバッグするにはどうすればよいですか?

4

1 に答える 1

0

単純すぎるかもしれませんが、MySQL でスロー クエリ ログをオンにして、上位 10 ~ 25 のスロー クエリを見つけることができます。

スロー クエリのリストを取得したら、Percona Toolkitを使用してそれらを分析できます。

ack/ack-grepを使用して、犯人とその住んでいる場所を見つけます。MySQL を直接呼び出すファイルが多数ある場合、MySQL コメントをクエリに追加/添付する方法を使用してそれらすべてをルーティングするのは面倒であり、最も効率的ではない可能性があります。

複数のアプリが同じデータベースに接続している場合は、ユーザーも分離して、データベース リソースを消費しているユーザー/アプリケーションを特定できるようにすることをお勧めします。

于 2014-08-20T16:23:40.703 に答える