ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

php – MySQL准备语句与普通查询.收益与损失

2019-07-21 22:17:04  阅读:129  来源: 互联网

标签:php mysql web-services


我正在更新/重新编写一些数据库代码,我想知道,使用预准备语句我应该期待什么.

以此示例代码为例:
(光着我,我知道它很难看 – 我写的)

$values = '';
for ($i = 0; $i < $count; $i++) {
    $name = mysql_real_escape_string ($list[$i][1]);
    $voc = mysql_real_escape_string ($list[$i][3]);
    $lev = $list[$it][2];
    $lev = is_numeric ($lev)? $lev : 0;

    $values .= ($values == '')? "('$name', '$voc', $lev)" : ", ('$name', '$voc', $lev)";
}
if ($values != '') {
    $core->query ("INSERT INTO onlineCList (name, voc, lev) VALUES $values;");
}

现在,除了可读性(理智性)明显增加以及max_packet_size不再成为问题这一事实之外,当我重新编写使用预准备语句时,我是否应该期待性能的任何变化?我正在远程连接到MySQL服务器,我担心发送多个小数据包会比发送一个大数据包慢得多.如果是这种情况,MySQLi / mysqlnd可以缓存这些数据包吗?

另一个例子:

$names = '';
while ($row = mysql_fetch_array ($result, MYSQL_ASSOC)) {
    $name = mysql_real_escape_string($row['name']);

    $names .= ($names == '') ? "'$name'" : ", '$name'";
}
if ($names != '') {
    $core->query ("UPDATE onlineActivity SET online = NULL WHERE name IN ($names) AND online = 1;");
}

如上所述,我应该在重新编码后使用准备好的语句吗?它是否对MySQL服务器有任何影响,如果它必须运行一个带有大IN子句的查询,或者多个准备好的查询具有相等性检查(.. WHERE name = $name AND ..)?

假设所有内容都已正确编入索引.

解决方法:

通常,如果您只使用预准备语句代替普通查询,那么它会稍微慢一点,因为查询是以两步而不是一步编写和执行的.只有在准备语句然后多次执行时,准备好的语句才会变得更快.

但是,在这种情况下,您使用的是mysql_real_escape_string,它会对数据库进行往返.更糟糕的是,你是在一个循环中进行的,因此,每次查询多次执行它.因此,在这种情况下,用一个准备好的声明替换所有这些往返是一种双赢.

关于你的上一个问题,没有理由你不能像使用正常的查询解析器一样使用与预准备语句相同的查询(即没有理由用IN执行一个版本而另一个用一堆OR执行). prepared statement可以有IN(?,?,?),然后你只需绑定那么多参数.

我的建议是始终使用准备好的陈述.如果它们增加了边际性能开销,那么它们仍然值得为安全性(无SQL注入)和可读性带来好处.当然,只要你发现自己使用mysql_real_escape_string,就应该使用预备语句. (对于简单的一次性查询,不需要转义变量输入,它们不是绝对必要的.)

标签:php,mysql,web-services
来源: https://codeday.me/bug/20190721/1495860.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有