1

今天我们公司的一位资深人士告诉我,我为在 MySQL 数据库上执行准备好的语句而编写的 PHP 代码“效率低下”并且“对我们的服务器负担过重”。从那时起,我发现自己处于试图理解他的意思然后解决它的困难境地。我已经四天没有联系到那个人了,所以我问其他开发人员他们对我的代码的看法,以及是否有任何区域可能导致服务器性能出现瓶颈或问题。

我的代码可以工作并在变量 $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 代码和 SQL 代码,或两者兼而有之。

例如,如果 `col` 列未在数据库中建立索引,则 SQL 会出现问题。这会给数据库带来大量负载,因为数据库必须扫描很多行来回答查询。如果 `col` 没有在给定查询中建立索引,则将扫描表中的所有行。此外,如果传入的值不是很有选择性,则必须检查许多行,也许是所有行,因为当检查许多行时,MySQL 将选择表扫描而不是索引扫描。您将需要熟悉 MySQL EXPLAIN 计划功能来修复您的查询,或向数据库添加索引以支持您的查询。

如果您遵循以下模式,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 回答