结合查询和优化PHP

时间:2013-09-17 17:37:33

标签: php mysql sql

我正在尝试创建尽可能精简的脚本。当前实现需要20分钟来处理3k记录。 我写了一个快速而又脏的脚本,在大约90秒内处理相同的信息。我现在必须提取配置信息和其他一些东西,所以我试图优化我能做的一切。

以下是我现在所拥有的:

$key_query = mysql_query("SELECT * FROM configuration WHERE configuration_group_id = 6501 AND configuration_key = 'RCS_SKIP_DAYS';");
if (!$key_query) {
    echo "DB Error, could not query the database\n";
    echo 'MySQL Error: ' . mysql_error();
    exit;
}
$key = mysql_fetch_array($key_query);
$skip_days = $key['configuration_value'];
mysql_free_result($key_query);

$key_query = mysql_query("SELECT * FROM configuration WHERE configuration_group_id = 6501 AND configuration_key = 'RCS_BASE_DAYS';");
if (!$key_query) {
    echo "DB Error, could not query the database\n";
    echo 'MySQL Error: ' . mysql_error();
    exit;
}
$key = mysql_fetch_array($key_query);
$base_days = $key['configuration_value'];
mysql_free_result($key_query);

$key_query = mysql_query("SELECT * FROM configuration WHERE configuration_group_id = 6501 AND configuration_key = 'RCS_EMAIL_TTL';");
if (!$key_query) {
    echo "DB Error, could not query the database\n";
    echo 'MySQL Error: ' . mysql_error();
    exit;
}
$key = mysql_fetch_array($key_query);
$ttl_days = $key['configuration_value'];
mysql_free_result($key_query);

$skip_date =  date('Ymd',strtotime('-'.$skip_days.' day',time()));
$base_date =  date('Ymd',strtotime('-'.$base_days.' day',time()));
$ttl_date =  date('Ymd',strtotime('-'.$ttl_days.' day',time()));

我不确定是否可以将3个配置键拉到一起并分配给变量,或者是否有更好的方法来优化它。

我感谢所有人的帮助!

3 个答案:

答案 0 :(得分:3)

首先要停止使用这个mysql_query这个函数不推荐使用,尝试使用mysql pdo或mysql li

Mysql PDOMysqlli

下一步,您可能希望更改“select *”,这是一个很大的流程费用,请尝试指定您要选择的列。

答案 1 :(得分:2)

您是否考虑过IN语法?这很甜蜜。如果您只需要几个字段,也绝对不需要SELECT * FROM

<?php

$sql = "SELECT configuration_key , configuration_value FROM configuration WHERE configuration_group_id = 6501 AND configuration_key IN ('RCS_SKIP_DAYS','RCS_BASE_DAYS','RCS_EMAIL_TTL')";

$query = mysqli_query($sql);

while(mysqli_fecth_assoc($query) as $row){
    echo '<pre>'.print_r($row, true).'</pre>';
}

?>

答案 2 :(得分:1)

您应该能够在单个查询中获取所有数据,然后对其进行过滤:

$key_query = "SELECT configuration_key , configuration_value FROM configuration WHERE configuration_group_id = 6501      AND configuration_key = 'RCS_SKIP_DAYS' OR configuration_key = 'RCS_BASE_DAYS' or configuration_key = 'RCS_EMAIL_TTL';"

此外,您似乎只是在寻找一个configuration_value,所以只需要询问该列。

根据建议,使用最新的MySQL PDO驱动程序。