【问题标题】:Why extra spaces and linebreaks in queries are bad?为什么查询中的额外空格和换行符不好?
【发布时间】:2011-06-09 10:29:31
【问题描述】:

我经常看到人们说从客户端应用程序发送到服务器的 SQL 查询不应包含任何额外的换行符或空格。我听说的原因之一是“为什么要浪费网络流量?”。

是否有真正的理由让代码更难阅读和编辑以支持删除所有空格?

带空格:

$q = 'SELECT
            `po`.*,
            `u`.`nickname`,
            `u`.`login`
        FROM
            `postponed_operations` AS `po`
            LEFT JOIN `users` AS `u` ON `u`.`id` = `po`.`user_id`
        ORDER BY `will_be_deleted_after`';
return mysql_query($q);

没有空格:

$q = 'SELECT '.
            '`po`.*,'.
            '`u`.`nickname`,'.
            '`u`.`login`'.
        'FROM '.
            '`postponed_operations` AS `po` '.
            'LEFT JOIN `users` AS `u` ON `u`.`id`=`po`.`user_id` '.
        'ORDER BY `will_be_deleted_after`';
return mysql_query($q);

【问题讨论】:

  • 我想你的意思是有一个没有空格的压缩查询?也许 1 行?
  • @JohnP,请注意,在第二个示例中,每一行由一个单引号分隔的字符串组成,连接到前一行的字符串上。
  • @Nightwolf:也许数据库作为应用程序位于另一台服务器上。
  • @Wesley van Opdorp:大声笑,当您打算通过网络传输查询结果时,您最多担心 20 个字符。我一开始也是这么想的。
  • @Hammerite @SilverLight 谢谢,完全掩盖了连接!

标签: php mysql coding-style formatting


【解决方案1】:

的确如此,它会消耗网络流量和服务器时间;但除了最极端的情况外,它在所有情况下都可以忽略不计。 现在,如果您正在编辑 FaceBook(或 Google,或类似的)的代码,并以这种方式优化 10 个最常见的查询,那么有一点很重要,因为它们每天将运行数十亿次。 但在所有其他情况下,我认为考虑删除空格是浪费时间。

【讨论】:

    【解决方案2】:

    这是主观的,但在我看来,可读性胜过一些额外的空格和换行符。如果编码标准要求每次都断开字符串,我可能会发疯。

    【讨论】:

      【解决方案3】:

      如果您绝对必须优化空间等,请不要在您的源代码中这样做。而是通过一个自动化的中间工具来实现。

      如果我们谈论的是网络,我会说这样做的额外成本对于静态内容(很少更改的脚本文件等)可能是值得的,但我会怀疑为动态内容这样做。

      在所有情况下:

      • 如果您更改源,这将是一场维护噩梦。
      • 如果通过压缩/解压缩工具进行处理,与简单地删除空间相比,您将节省更多(平均而言),但会以延迟和 CPU 时间为代价。
      • 除非你有一些真正的病态结构,否则它基本上只占总成本的一小部分,即使我们只考虑 TCP 数据包的大小和返回的查询数据。

      也许与您的情况无关,但我还是会提到它:一种完全不同的方法可能是使用紧密打包的消息格式而不是查询 ID,而不是每次都传输查询。

      【讨论】:

        【解决方案4】:

        当然。我一直都这样做。我也:

        • 删除反引号。谁需要它们?

        因此,

        `po` ----- becomes -----> po 
        
        • 为数据库、表、字段、索引等使用尽可能小的名称。

        因此,

        postponed_operations  --- becomes ---> po    --- p is already taken for posts
        will_be_deleted_after --- becomes ---> wi    --- w is already taken for words
        
        • 完全删除不必要的关键字,如@9​​87654323@。无论如何,所有表名都很短(规则 2!)

        因此,

        LEFT JOIN `users` AS `u`  --- becomes --->   LEFT JOIN u 
        

        因此,我会将上述查询写为:

        $q='SELECT po.*,ni,lo FROM po LEFT JOIN u ON i=ui ORDER BY wi'
        

        标签:

        joke

        【讨论】:

        • 如果这是个玩笑,您可能需要指定它
        • @Kon:好的。添加标签 joke :)
        • 哈哈哈!!我不想赞成答案,因为其他人可能会开始流行,而您的答案可能会获得最多的选票.. :D 但我绝对可以赞成评论! :D
        【解决方案5】:

        虽然删除不必要的空格和换行符确实会减少您发送到数据库服务器的数据量,但您不应该为此烦恼。

        您应该关心代码的可读性和可维护性。这是您在编写软件代码时需要牢记的两件非常重要的事情!

        如果减少网络流量是唯一的好处,那么我们可以争辩说您应该为您编写的每个查询创建一个Stored Procedure

        例如。您可以更改以下查询

        SELECT
                    `po`.*,
                    `u`.`nickname`,
                    `u`.`login`
                FROM
                    `postponed_operations` AS `po`
                    LEFT JOIN `users` AS `u` ON `u`.`id` = `po`.`user_id`
                ORDER BY `will_be_deleted_after`;
        

        CALL GetLoginData();
        

        现在这将减少约 80-95%。但值得吗?

        绝对没有。

        做这样的事情宁愿让开发者的生活变得悲惨而不增加任何显着的价值!

        话虽如此,仅在没人会更改代码的地方使用缩小版的代码。例如。你永远不会改变的 CSS 库和 JS 库!

        我希望你明白了,你会继续编写可读和可维护的代码!

        【讨论】:

          猜你喜欢
          • 2018-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-15
          • 2018-08-30
          • 1970-01-01
          相关资源
          最近更新 更多