1

今日、私は会社の先輩から、MySQLデータベースでプリペアドステートメントを実行するために作成したPHPコードは「非効率的」であり、「サーバーに負担がかかりすぎる」と知らされました。それ以来、私は彼が何を意味するのかを理解し、それを修正しようとするという困難な立場にいることに気づきました。私はこの人と4日間連絡がないので、他の開発者に私のコードについてどう思うか、サーバーのパフォーマンスにボトルネックや問題を引き起こす可能性のある領域があるかどうかを尋ねています。

私のコードは機能し、クエリの結果を変数$ dataに返すので、技術的には機能します。それが効率的でうまく書かれているかどうかについては別の質問があります。その先輩が何を意味しているのか、何を言っているのかについて何かアドバイスはありますか?これが私がデータベースに接続してクエリを実行するために使用する方法です。

(メソッドという言葉を使用する場合、クラス内のメソッドを意味するのではないことに注意してください。つまり、データベースに接続してクエリを実行するときにコードを記述/構造化する方法です。)

<?php

// Create database object and connect to database
$mysqli=new mysqli();
$mysqli->real_connect($hostname, $username, $password, $database);

// Create statement object
$stmt=$mysqli->stmt_init();

// Prepare the query and bind params
$stmt->prepare('SELECT `col` FROM `table` WHERE `col` > ?');
$stmt->bind_param('i', $var1);

// Execute the query
$stmt->execute();

// Store result
$stmt->store_result();

// Prepare for fetching result
$rslt=array();
$stmt->bind_result($rslt['col']);

// Fetch result and save to array
$data=array();
while($stmt->fetch()){
    foreach($rslt as $key=>$value){
        $row[$key]=$value;
    } 
    $data[]=$row;
}

// Free result
$stmt->free_result();

// Close connections
$stmt->close();
$mysqli->close();

?>

どんなアドバイスや提案も役に立ちます。推測しているだけでも、貢献して助けてください。前もって感謝します :)

4

1 に答える 1

1

非効率的なコードには、PHPコードとSQ​​Lコード、またはその両方の2種類があります。

たとえば、 `col`列がデータベースでインデックス付けされていない場合、SQLは問題になります。データベースはクエリに応答するために非常に多くの行をスキャンする必要があるため、これはデータベースに多くの負荷をかけます。指定されたクエリで`col`のインデックスが作成されていない場合、テーブル内のすべての行がスキャンされます。また、渡された値があまり選択的でない場合、MySQLは多くの行が検査されるときにインデックススキャンよりもテーブルスキャンを選択するため、多くの行、おそらくすべての行を検査する必要があります。クエリを修正するにはMySQLEXPLAINプラン機能に精通するか、クエリをサポートするためにデータベースにインデックスを追加する必要があります。

次のようなパターンに従った場合、PHPは問題になります。

select invoice_id from invoices where customer_id = ?
for each invoice_id
   select * from line_items where invoice_id = ?   

この種のパターンは、データベースの「過剰クエリ」につながり、データベースに余分な負荷がかかります。
代わりに、結合を使用してください。

select li.* from invoices i join line_items li using (invoice_id)

データベース管理者に、遅いクエリログをオンにしてから、pt-query-digestで処理するように依頼してください

pt-query-digestを使用して、コストがかかる(実行に時間がかかる)クエリについてレポートしたり、頻度別にレポートして過剰クエリを検出したりすることができます。

于 2012-08-02T22:32:13.923 に答える