【问题标题】:PDO PHP Mysql slow on particular queryPDO PHP Mysql 在特定查询上很慢
【发布时间】:2012-05-26 00:16:43
【问题描述】:

我在 php 中使用 PDO for Mysql 遇到了一个非常奇怪的问题。

我有一张大约有 30,000 行的表格。

如果我尝试运行此查询:

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks WHERE card_data.name = '法力泄漏' and card_data.enabled = 1 GROUP BY card_data.name ORDER BY card_data.name

(如何制作)

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks  
WHERE card_data.name = ? and
card_data.enabled = 1 GROUP BY card_data.name  ORDER BY card_data.name ASC

$paramArray = array("Mana Leak");
$sth->execute($paramArray);

通过 PDO 执行大约需要 10 秒!但是,如果我通过 phpmyadmin 运行相同的查询,则只需不到一秒钟的时间..

奇怪的是,下面的这个查询通过 PDO 只需要不到一秒钟的时间:

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks  WHERE 
(card_data.name = 'Extraplanar Lens' OR card_data.name = 'Mana Leak' OR card_data.name = 
'overgrowth')  and card_data.enabled = 1 GROUP BY card_data.name  ORDER BY card_data.name ASC

(如何制作)

  SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks  WHERE 
    (card_data.name = ? OR card_data.name = ? OR card_data.name = 
    ?)  and card_data.enabled = 1 GROUP BY card_data.name  ORDER BY card_data.name ASC

    $paramArray = array("Extraplanar Lens","Mana Leak","overgrowth");
    $sth->execute($paramArray);

我一辈子都无法锻炼,为什么搜索一个“名字”需要 10 秒,而搜索多个名字只需要大约 0.4 秒...

编辑:情节变厚。我删除了参数化语句并将要搜索的文本硬编码

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks WHERE
card_data.name = Mana Leak and card_data.enabled = 1 GROUP BY card_data.name ORDER BY 
card_data.name ASC

使用 PDO 查询耗时 0.000384092330933 秒!!

但是

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks WHERE
card_data.name = 'Mana Leak' and card_data.enabled = 1 GROUP BY card_data.name ORDER BY 
card_data.name ASC

使用 PDO 查询需要 11.00254 秒!!

【问题讨论】:

  • 你的表 card_data.name 里面有没有字段?
  • 对不起,我不明白你的意思?该字段是表card_data中的名称
  • 只是出于兴趣,如果您将查询存储在存储过程中并通过 PDO 和 PHPMyAdmin 运行,您会得到相同的延迟吗?
  • 好问题。我会找出答案的!
  • 既然你只使用了一张表 card_data 那么你为什么要通过再次引用来混淆它,它的名字来自 card_data 就足够了! D:

标签: php mysql pdo


【解决方案1】:

慢通常意味着您需要索引。我看到你在card_data.set_order 上有一个max() 函数。这意味着您的数据库必须检查每条记录才能找到最大的记录。

查看该字段是否有索引。如果没有,添加一个,看看是否可以改善它

【讨论】:

  • 添加索引效果很好!非常感谢。虽然我仍然有点困惑为什么搜索单个“名称”和搜索多个名称之间存在近 300 倍的差异!
  • 我实际上将索引添加到名称字段仅供参考,这就是修复它的原因。只是重新阅读您所说的内容,您是否建议将其添加到 card_data.set_order 字段中?
  • 是的,通常在 WHERE 子句中使用字段应该会敲响索引。但是 MAX() 是一个必须遍历每条记录才能找到最大函数的函数。您可以在 phpmyadmin 中运行“EXPLAIN SELECT ....”来确定查询的效率并了解我的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多