2010-06-11 38 views
-2

我有4个MySQL表,并有多个表上JOIN单个查询,我通过jquery ajax请求它,但它需要太长时间,从约1-3分钟,而我想要平均执行2-5秒。我怎么能快速执行大型MySQL查询

有什么特别的方法可以快速执行查询吗?

+3

请添加一些更多信息,例如您正在使用的确切查询/查询; Ajax和PHP代码;你在做什么以及究竟是什么瓶颈让它变得如此缓慢。 – 2010-06-11 09:24:45

+1

查询通常执行得很快......您确定问题出在查询中吗?......也许您在请求之后做了一些事情,似乎很慢...... – Reigel 2010-06-11 09:25:03

+0

如果有一种特殊的方法可以使查询快速,我相信DBMS已经将这种特殊方式作为标准方式:) – 2010-06-11 09:29:26

回答

5

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

  1. 检查指标
  2. 做1个大的查询ins't总是更快,这样做了几个小的(检查每个性能)

与样品SQL更详细的问题,将作为帮助好。

+0

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 这里是我的查询,我只是得到结果或包含在其中的帖子 – 2010-06-11 09:31:12

+0

我也怀疑使用DISTINCT的查询。这有一些有效的用途,但通常用作坏数据或结构的拐杖。事实上,团体保证disonyntness ... – blissapp 2010-06-11 12:46:11

2

通过连接,加快速度的主要操作是在ON子句中的字段上创建一个索引。

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?
  • 在连接语句上的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想要处理的查询。

1

没有看到的模式,行大小,行数在数据库中,并为典型的同一统计查询其不可能劝你要去哪里错了。与pdwalker不同的是,我在join语句中看到了条件表达式,而且我仍然不知道您的查询打算做什么。我怀疑它是一个非常聪明的代码或非常愚蠢的代码。

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

C.

2

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

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

+0

所有非常好的点,罗比+ 1 – Mawg 2010-06-11 14:23:00

2

要回答你的实际问题。不,没有特殊的方法可以快速查询。我们并没有一直在使用秘密的“FAST”参数,并且在慢速查询的过程中大笑。