首页 > 代码库 > 关于SQL中SELECT *(星号)的危害论

关于SQL中SELECT *(星号)的危害论

听闻有许多人是禁止开发人员在SQL中使用SELECT *的,这里翻译一下StackOverflow的一篇提问,个人认为相当客观

【SELECT *】危害主要有以下几点:

  • 给数据消费者传数据的低效。当你SELECT *后常常你会从数据库查询出比你应用的功能实际需要过多的列,这还可能导致多余数据从数据到服务端到客户端,从而导致机器负担的增加,同样地网络传输也会增加负担。特别当数据表增加了新列,但是功能实现那根本又不需要。
  • 索引问题。想象一下这样一个场景:你需要调一个Query调到一定的高性能。如果你用了SELECT *然后返回全部列超过了你需要的列,服务端经常需要为接收你的数据而消耗代价更多的函数而本来是不用的。举个例子,你不可能简简单单创建一个覆盖你SELECT出来全部列的索引,即使你这样做了(包含全部列,想想都可怕),下一个挖坑人又在数据表中增加了新的列就导致你原本已覆盖的索引无法优化了,然后你会惊奇地发现你的Query性能噗噗噗地下降,又没有明显的原因。
  • 绑定问题。当你SELECT *之后,有可能查询到来自两张表但是名称一样的列。这样可能会引起数据绑定端或者功能点崩溃,想想返回来有两列数据都是ID,谁TM知道用哪一列?SELECT *还可能搅乱视图(部分数据库、版本)——当底层数据表结构改变,视图又没有新建,视图的数据可能会返回无意义的数据(名称乱不好维护?)。最惨的,你能折腾好以你命名的列,但新来的挖坑人要加入列的时候就不知道他应该如何命名列名才不会与你已经埋好的列名冲突了。

 

关于SQL中SELECT *(星号)的危害论