Php 内存中的SQL性能(连接与循环)

Php 内存中的SQL性能(连接与循环),php,mysql,performance,join,Php,Mysql,Performance,Join,我和我的一位同事就SQL(更多的是mysql)中的连接进行了一次非常激动人心的讨论。我不敢相信我应该不惜一切代价逃避联接,因为带有一个大表的联接会将整个表加载到服务器的内存中,因此会用大量数据填充内存。但是如果我使用一个没有连接和循环的简单查询,它在内存和处理速度方面会有更好的性能。例如(其更多的伪代码和PHP): 表的大小: 用户:30MB 行动:20kb 代码(带连接) 代码(不带Join和foreach循环) 结果是一样的,但我必须选择第二个选项,因为在我的公司,我们不允许使用加入

我和我的一位同事就SQL(更多的是mysql)中的连接进行了一次非常激动人心的讨论。我不敢相信我应该不惜一切代价逃避联接,因为带有一个大表的联接会将整个表加载到服务器的内存中,因此会用大量数据填充内存。但是如果我使用一个没有连接和循环的简单查询,它在内存和处理速度方面会有更好的性能。例如(其更多的伪代码和PHP):

表的大小:

  • 用户:30MB
  • 行动:20kb
  • 代码(带连接)

  • 代码(不带Join和foreach循环)

  • 结果是一样的,但我必须选择第二个选项,因为在我的公司,我们不允许使用加入(见上文解释),不仅在我的littel广告公司,甚至在更大的公司(50-100名员工或在线游戏开发),他们也不允许使用加入

    这是公司(尤其是网站)做的事情吗?拧上连接,因为一个网站的1000名访问者同时可能会使服务器内存溢出


    我无法相信这种说法。执行代码的速度不是比在所有必需的数据上循环好得多吗?

    连接通常(尽管并不总是)比在循环中执行单个查询更有效,因为每个查询都有开销。。。。连接不会将整个表加载到内存中,使用fetchall()等函数的代码会这样做。嗯,如果我质疑您的答案,很抱歉,但是fetchall()、fetch()或fetchcolumn()函数不应该给出从数据库执行的查询的结果吗?我的意思是,为什么这个函数要在数据库中保存查询的执行时将整个表加载到他的内存中呢。fetch(),fetchall()。。。只收集给定的结果集的行。
    fetch()
    一次从结果集中提取一条记录到PHP内存中,允许您以任何方式处理该记录,然后继续并
    fetch()
    下一条记录。。。。PHP内存中一次只有一条数据库记录
    fetchall()
    同时将结果集中的每条记录(函数名中的“all”就是这个意思)拉入PHP内存。。。。因此,如果您在结果集中有100条记录,
    fetch()
    允许您在PHP内存中一次有一条记录,而
    fetchall()
    将使用100倍的内存将所有100条记录加载到PHP内存中,这并不是成本高昂的
    fetch
    ;这是循环中的
    SELECT
    。。。。连接不会将整个表加载到内存中,使用fetchall()等函数的代码会这样做。嗯,如果我质疑您的答案,很抱歉,但是fetchall()、fetch()或fetchcolumn()函数不应该给出从数据库执行的查询的结果吗?我的意思是,为什么这个函数要在数据库中保存查询的执行时将整个表加载到他的内存中呢。fetch(),fetchall()。。。只收集给定的结果集的行。
    fetch()
    一次从结果集中提取一条记录到PHP内存中,允许您以任何方式处理该记录,然后继续并
    fetch()
    下一条记录。。。。PHP内存中一次只有一条数据库记录
    fetchall()
    同时将结果集中的每条记录(函数名中的“all”就是这个意思)拉入PHP内存。。。。因此,如果您在结果集中有100条记录,
    fetch()
    允许您在PHP内存中一次有一条记录,而
    fetchall()
    将使用100倍的内存将所有100条记录加载到PHP内存中,这并不是成本高昂的
    fetch
    ;这是循环中的
    选择
    $actionArray = sql_stmt(SELECT action.rating, user.username FROM user INNER JOIN action on user.id = action.id WHERE action.id = 1)
    
    $endresult[] = $actionArray
    
    $actionArray = sql_stmt(SELECT * FROM action WHERE id = 1);
    
    foreach (actionArray as $row) {
    
       $user = sql_stmt(SELECT * FROM user WHERE id = $row['userid'];
       $endResult['rating'] = $row['rating'];
       $endResult['username'] = $user['username'];
    
    }