【发布时间】:2018-03-25 01:55:18
【问题描述】:
我正在从 php 连接到 mysql 数据库并进行 3 次查询(参见下面的代码)。一切正常,但是,当我检查这个 php 脚本从0.5 - 2.5 secs 获取的性能时。造成这种时间差异的可能原因是什么?一般来说,您对如何提高脚本的性能(可能优化请求或使用其他功能)有什么建议吗? fingerprint 和 IP 列已编入索引。非常感谢!
$conn = new mysqli('localhost', 'user1', 'pass1', 'db1');
$sql = 'INSERT INTO Test '.
'(token, result, Link, IP, useragent, resolution, language, screen, fingerprint) '.
'VALUES ("' .$_GET['token_']. '", "OK", "ststsebhoupe", "'.$_GET['addr_'].'", "'.$_SERVER['HTTP_USER_AGENT'].'", "'.$_GET['flag_'].'", "'.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'", "'.$_GET['screen_'].'", "'.$_GET['fingerprint_'].'")';
$conn->query($sql);
$found1 = $conn->query("SELECT COUNT(*) FROM Test WHERE `Link` = 'ststsebhoupe' and `fingerprint` = '".$_GET['fingerprint_']. "'")->fetch_row()[0];
$found2 = $conn->query("SELECT COUNT(*) FROM Test WHERE `Link` = 'ststsebhoupe' and `IP` = '".$_GET['addr_']. "'")->fetch_row()[0];
$conn->close();
【问题讨论】:
-
您可以在 MySQL 中创建一个 VIEW 以确实对仅创建一个的选择信息进行两次查询并提取两个值,这可能会占用您的进程时间
-
您还可以构建一个存储过程,让 SQL 引擎而不是服务器(在本例中为 PHP)工作,并且您的流程可以优化 99%
-
您可以做的第一件事是删除
COUNT(*),而是使用主键列(或任何其他NOT-NULL列,以防不存在PK列)代替COUNT(id)。之后您可以接受@Fernando 的建议 -
查看表定义和
EXPLAIN每个查询的查询计划会有所帮助。 -
@FernandoUrban - MySQL
VIEWs是语法糖;您不会获得任何性能优势。
标签: php mysql performance