来自foo的select *有什么含义?

时间:2011-03-04 14:28:25

标签: mysql sql database

  

可能重复:
  Can select * usage ever be justified?

很想听到有更多DBA洞察力的人的这一点,但是当您看到如下查询时,应用程序会面临什么性能影响:

select * from some_large_table;

你必须进行全表扫描,因为没有命中索引,我相信如果我们说的是O符号,我们在这里说O(N),其中N是表的大小。这通常被认为不是最佳行为吗?如果你确实需要在某些时候从表中获得所有内容,该怎么办?是的,我们有分页等工具,但我在这里严格地从数据库角度谈论。这种行为通常不受欢迎吗?

3 个答案:

答案 0 :(得分:1)

如果不指定列,会发生什么,数据库引擎必须查询列表的主表数据。此查询非常快,但会导致轻微的性能问题。只要你没有用JOIN语句或嵌套查询做一个草率的SELECT *,你应该没问题。但是,请注意让DB Engine执行查询以查找列的性能影响很小。

答案 1 :(得分:0)

MySQL服务器在服务器端打开游标以读取该表。查询的客户端可以读取所有记录,并且客户端的性能仅取决于它实际获取的记录数。此外,服务器端查询的性能在某些条件下实际上可能比查询更快,因为它还涉及一些索引读取。仅当客户端获取所有记录时,它才相当于全表扫描。

答案 2 :(得分:0)

  1. 选择多于您需要的列(select *)总是不好的。
  2. 不要做得多
  3. 如果您从整个表中进行选择,那么您是否拥有索引并不重要。
  4. 您要遇到的其他一些问题是您想要锁定表格的方式。如果这是一个繁忙的应用程序,您可能不希望完全阻止锁定,因为可能返回的数据不一致。但如果你锁得太紧,可能会进一步减慢查询速度。任何计算机科学应用程序都认为O(n)是可以接受的。然而,在数据库中,我们及时测量和读/写次数。这是大量的读取,可能需要很长时间才能执行。因此这是不可接受的。