我怎样才能快速执行大型mysql查询

时间:2010-06-11 09:22:27

标签: php jquery

我有4个mysql表,并且在多个表上使用JOIN进行单个查询,我通过jquery ajax请求它,但是需要太长时间,大约需要1-3分钟,而我想平均执行它们2- 5秒。

有快速执行查询的特殊方法吗?

8 个答案:

答案 0 :(得分:5)

有多种方法可以优化查询。

  1. 检查索引
  2. 做一个大型查询并不总是更快做一些小查询(检查每个查询的性能)
  3. 使用示例SQL的更详细的问题也会有所帮助。

答案 1 :(得分:2)

使用连接,加速操作的主要操作是在ON子句中的字段上创建索引。

答案 2 :(得分:2)

SELECT 
     DISTINCT * 
FROM 
   posts s 
JOIN 
   budy f ON s.userid = f.fid AND s.time >= f.f_since OR s.userid='$thisid' 
WHERE 
   f.myid='$thisid' 
GROUP BY 
   s.pid DESC 
LIMIT 20

查看您的查询,我认为您的JOIN是罪魁祸首。我从未见过附加布尔条件的连接语法,所以我不确定如果不直接在mysql上测试它会如何表现。

明显的想法:

  • 是posts.userid索引?
  • 是f.fid索引?
  • 如何关于posts.time和budy.f_since?
  • 在join语句中使用AND和OR选项是否需要括号?

您是否尝试重写查询以查看您的时间是否可以改善?也许这可能会产生影响:

SELECT 
     DISTINCT * 
FROM 
   posts s 
JOIN 
   budy f ON s.userid = f.fid  
WHERE 
   s.userid='$thisid'
   s.time >= f.f_since
GROUP BY 
   s.pid DESC 
LIMIT 20

由于我不确定您的表格中有哪些数据以及您希望看到的连接结果,我无法确定我的查询是否符合您的要求。你需要先检查它们。另外,不要忘记使用EXPLAIN命令找出mysql想要对你的查询做什么。

答案 3 :(得分:2)

我发现你编写查询的方式可能意味着执行时间小时或几天到5毫秒之间的差异(非常大的数据库上的实际结果)。

我做的一些事情是学习读取EXPLAIN结果(这是你用来查找MySQL如何理解你的查询的最有价值的工具)使用子查询而不是连接,如果数据库指定了“索引提示”不使用正确的索引,添加组合索引(primary,column_1,column_2)并附加“straight_join”以强制数据库按照您指定的顺序连接表。

答案 4 :(得分:2)

首先,使用EXPLAIN查找瓶颈! EXPLAIN告诉您有关查询执行方式的详细信息。这应该始终是优化查询(添加索引,重写查询等等)的第一个起点。

http://dev.mysql.com/doc/refman/5.1/de/explain.html

答案 5 :(得分:2)

回答你的实际问题。没有。没有特殊的方法可以快速查询。我们并没有全部使用秘密的“FAST”参数,并且在您使用较慢的查询时会大笑。

答案 6 :(得分:1)

绝对是索引。但也许你的数据库结构不合理。

您可能想尝试审核数据库 - 请参阅http://dev.mysql.com/doc/refman/4.1/en/account-activity-auditing.html

答案 7 :(得分:1)

如果没有查看架构,行大小,数据库中的行数以及典型查询的相同统计信息,则无法告知错误的位置。与pdwalker不同,我在join语句中看到过条件表达式,但我仍然不知道你的查询是做什么的。我怀疑它是一个非常聪明的代码或非常愚蠢的代码。

99%的情况下,可以通过调整查询/架构来解决这些问题。对于其他1%,您需要查看您的基础设施 - 例如拥有数据库集群(即使它是主/从)而不是单个节点。

下进行。