MySQL vs PHP 查询性能问题

Posted

技术标签:

【中文标题】MySQL vs PHP 查询性能问题【英文标题】:MySQL vs PHP query performance issues 【发布时间】:2012-07-31 21:33:07 【问题描述】:

我有一个在 mysql (Navicat) 中运行大约 2 秒的 sql 查询,它通过 600,000 个位置返回所有表数据并计算我输入的经纬度之间的距离。

SQL 是这样的:

select *, 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - 
radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
FROM places 
GROUP BY places.user_id
HAVING distance > 0
ORDER BY distance LIMIT 0 , 10;

在上述查询中,37 和 -122 以 lat 和 long 的形式传递到查询中。

当我在 Navicat 中运行时,需要 2 秒,但在 Cakephp 或使用 mysql_query() 的直接 php 中需要几分钟。

为什么会发生这种情况,我该如何解决?

我在运行 XAMPP 的 Win7 4GB 机器上本地运行 MySQL 和 Apache。

【问题讨论】:

1. dev.mysql.com/doc/refman/5.1/en/spatial-extensions.html 2. 调试 您能提供 EXPLAIN EXTENDED [您的查询] 吗?您能否通过以下操作确认查询在 2 秒内运行: 1. SELECT SQL_NO_CACHE [其余查询]? mysql_query?请不要使用mysql_* 函数编写新代码。它们不再维护,社区已经开始deprecation process。看到red box?相反,您应该了解prepared statements 并使用PDO 或MySQLi。如果你不能决定哪一个,this article 会帮助你。如果你选择 PDO,here is good tutorial。 是的,我没有使用 mysql_query,只是为了简单的测试!我实际上使用的是 Cakephp 的 $this->query。但是我的测试脚本是直接的 PHP 和我的 Cakephp 都很慢,而 SQL 脚本在没有缓存的情况下运行了 2 到 4 秒。为什么? 即使花 2 秒是 2 秒,对于 SQL 查询来说也太长了。你有合适的索引,对吧? 【参考方案1】:

这可能与您的表结构有关。如果您还没有,我强烈建议您在places 表中的user_id 上创建一个索引。这会在复杂查询的执行时间上产生惊人的差异。

此外,由于您似乎在查询中进行了大量计算(对于距离),您可能会从使用 mysqli 或 PDO 扩展中的准备好的语句功能中受益匪浅 - 而不是使用较旧、较慢、较少-安全的,不推荐使用的 mysql 扩展。

这篇文章有助于解释差异:http://php.net/manual/en/mysqli.overview.php

如果您已经习惯了 mysql 扩展,我建议您切换到 mysqli - 它们的程序语法/API 几乎相同(主要区别在于您需要提供 $connection_handle 作为许多函数的第一个参数,而不是作为可选的最终参数)。

Navicat 可能正在利用准备好的语句,这可能是你的不同之处。

【讨论】:

以上是关于MySQL vs PHP 查询性能问题的主要内容,如果未能解决你的问题,请参考以下文章

php + mysql - 性能 - 即时自动完成响应

MySQL 查询中的性能

php+mysql预查询prepare 与普通查询的性能对比

PHP 性能:每次点击时查询数据库?

PDO / PHP / MySQL 中的性能:事务与直接执行

Halite / Doctrine vs MySQL AES_ENCRYPT:安全/性能