为什么查询中的额外空格和换行符不好?

时间:2011-06-09 10:29:32

标签: php mysql coding-style formatting

我不时会看到人们说从客户端应用程序发送到服务器的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);

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:8)

这是主观的,但在我看来,可读性在任何时候都会占用额外的空间和换行符。如果编码标准每次都要求打破字符串,我可能会疯了。

答案 2 :(得分:1)

如果您绝对必须优化空间等,请不要在源代码中执行此操作。而是通过一个自动化的中间工具。

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

在所有情况下:

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

在您的情况下可能不相关,但无论如何我都会提到它:完全不同的方法可能是使用紧凑的消息格式而不是查询ID,而不是每次都传输查询。

答案 3 :(得分:0)

绝对。我一直这样做。我也是:

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

因此,

`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
  • 完全删除不必要的关键字,例如AS。无论如何,所有表名都很短(规则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

答案 4 :(得分:0)

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

相反,你应该为代码的可读性和可维护性而烦恼。这些是编写软件代码时需要记住的两件非常重要的事情!

如果减少网络流量是唯一的好处,那么我们可以争辩说你应该为你编写的每个查询创建一个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库!

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