【问题标题】:Varying type of mysql php request不同类型的mysql php请求
【发布时间】:2018-03-25 01:55:18
【问题描述】:

我正在从 php 连接到 mysql 数据库并进行 3 次查询(参见下面的代码)。一切正常,但是,当我检查这个 php 脚本从0.5 - 2.5 secs 获取的性能时。造成这种时间差异的可能原因是什么?一般来说,您对如何提高脚本的性能(可能优化请求或使用其他功能)有什么建议吗? fingerprintIP 列已编入索引。非常感谢!

$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


【解决方案1】:

为了加快那些两个SELECTs,在表上创建这两个索引:

INDEX(Link, fingerprint)  -- in either order
INDEX(Link, IP)           -- in either order

【讨论】:

  • 你能解释一下吗?
  • @AlexNevsky - 表中有多少行?添加这些索引;他们应该加快 SELECT 的速度。
  • 如上所述“指纹和 IP 列已编入索引。”谢谢
  • @AlexNevsky - INDEX(fingerprint)INDEX(Link, fingerprint)不同的并优化不同的查询。请添加我提到的复合索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 2023-01-29
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多