Php 如何快速执行大型mysql查询

Php 如何快速执行大型mysql查询,php,jquery,Php,Jquery,我有4个mysql表,在多个表上有一个带有JOIN的查询,我通过jQueryAjax请求它,但是它需要太长的时间,大约1-3分钟,而我希望平均2-5秒执行它们 有什么特殊的方法可以快速执行查询吗?有多种方法可以优化查询 检查你的索引 执行一个大型查询并不总是比执行几个小型查询更快(检查每个查询的性能) 对于示例SQL,更详细的问题也会有所帮助。对于联接,加快速度的主要操作是在on子句中的字段上创建索引 SELECT DISTINCT * FROM posts s JOIN

我有4个mysql表,在多个表上有一个带有JOIN的查询,我通过jQueryAjax请求它,但是它需要太长的时间,大约1-3分钟,而我希望平均2-5秒执行它们


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

有多种方法可以优化查询

  • 检查你的索引
  • 执行一个大型查询并不总是比执行几个小型查询更快(检查每个查询的性能)

  • 对于示例SQL,更详细的问题也会有所帮助。

    对于联接,加快速度的主要操作是在on子句中的字段上创建索引

    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
    
    看看你的问题,我认为你的加入是罪魁祸首。我从未见过附加布尔条件的连接语法,因此如果不直接在mysql上测试它,我不确定它将如何运行

    显而易见的想法:

    • posts.userid是否已编制索引
    • f.fid是否已编制索引
    • 从那以后,波斯特时间和布迪福乌呢
    • join语句上的AND或选项是否需要括号
    您是否尝试过重写查询以查看您的时间是否可以改进?也许这会有所不同:

    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想要对您的查询做什么。

    肯定是索引。但也许你的数据库结构很差


    您可能希望尝试审核数据库—请参阅,但不查看模式、行大小、数据库中的行数以及典型查询的相同统计信息—无法告知您出了什么问题。与pdwalker不同,我在join语句中看到了条件表达式,但我仍然不知道您的查询打算做什么。我怀疑它要么是一个非常聪明的代码,要么是一个非常愚蠢的代码

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


    C.

    我发现,如何编写查询可能意味着执行时间从几个小时或几天减少到5毫秒之间的差异(在非常大的数据库上的实际结果)


    我所做的一些事情是学习使用子查询而不是连接来阅读解释结果(这是发现MySQL如何理解查询的最有价值的工具),指定一个“索引提示”,以防DB使用不正确的索引,添加组合索引(主索引、列\ 1、列\ 2)并附加“直接\连接”要强制数据库按指定的顺序联接表。

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


    回答您的实际问题。没有。没有特殊的方法可以快速查询。我们并不是一直在使用秘密的“FAST”参数,当您在缓慢的查询中挣扎时,我们会大笑。

    请添加更多信息,例如您正在使用的确切查询;Ajax和PHP代码;你正在做什么,以及到底是什么瓶颈使它如此缓慢。查询通常执行得很快。。。您确定问题出在查询中吗?。。。也许你在请求之后做了一些事情,这让它看起来很慢……如果有一种特殊的方法可以使查询速度更快,我相信DBMS已经将这种特殊的方法作为标准方法:)这是非常模糊的,抱歉。调查非规范化和具体化视图选择DISTINCT*FROM posts s JOIN budy f ON s.userid=f.fid和s.time>=f.f_since或s.userid='$thisid',其中f.myid='$thisid'GROUP BY s.pid DESC LIMIT 20这里是我的查询,我只得到了itI中包含的结果或帖子,我还怀疑使用DISTINCT的查询。它有一些有效的用途,但经常被用作坏数据或结构的支柱。事实上,分组保证了不一致性。。。