2011-03-04 50 views
0

可能重複:
Can select * usage ever be justified?從foo中選擇*有什麼含義?

好奇,從更多的DBA洞察人聽到這一點,但什麼性能影響確實從當你看到這樣一個查詢的應用面:

select * from some_large_table;

您必須執行全表掃描,因爲沒有索引是b我相信如果我們在談論O符號,我們在這裏說O(N),其中N是表的大小。這通常被認爲不是最佳行爲?如果你確實需要在特定時間從桌面上的所有東西呢?是的,我們有諸如分頁等工具,但我在這裏嚴格從數據庫的角度來談論。這種行爲通常會被忽略嗎?

+0

通常,當涉及數據庫時,大O符號指的是磁盤IO的數量,而不是算術運算 –

+1

除了性能影響外,我絕不會推薦使用'select * from ...'。爲什麼?您的查詢不是未來證明。想象一下,你今天有4列。您期望從您的查詢中獲得4列。現在想象未來的某一天,一列將被添加或刪除,或者甚至兩列在該表中被交換。所有地獄都可能破裂。因此,最好在你的'選擇'中明確說明你需要的所有列。沒有更多,不少。 – darioo

+0

@Armen Tsirunyan:可以討論的觀點。精心設計和調整的服務器將始終將索引保留在內存中。因此,即使沒有執行磁盤IO,從B樹索引中獲取某些東西仍然會花費O(logN)。 – zerkms

回答

1

如果您不指定列,會發生什麼情況?數據庫引擎是否必須查詢列列表的主表數據。該查詢速度非常快,但會導致性能問題。只要你沒有用JOIN語句或嵌套查詢做一個馬虎SELECT *,你應該沒問題。但是,請注意讓數據庫引擎執行查詢來查找列的性能影響很小。

+0

「如果不指定列,會發生什麼情況,因爲數據庫引擎必須查詢列表列表的主表數據。」 - - 所以呢?當你拿起整個桌子時,它不是一個瓶頸。我甚至沒有提到表格元信息幾乎總是被緩存在內存中。 – zerkms

0

MySQL服務器在服務器端打開遊標以讀取該表。查詢的客戶端可能不會讀取任何或所有記錄,並且客戶端的性能僅取決於它實際獲取的記錄數。此外,服務器端查詢的性能可能比查詢時快一些,因爲它也涉及一些索引讀取。只有客戶端獲取所有記錄時,它才相當於全表掃描。

0
  1. 選擇比您需要的更多的列(select *)始終是不好的。不要做比你更多的事情
  2. 如果你從整個表格中進行選擇,你是否有索引並不重要。

你將要遇到的一些其他問題是你想如何鎖定表格。如果這是一個繁忙的應用程序,您可能不想完全防止鎖定,因爲可能會返回不一致的數據。但是,如果你鎖得太緊,可能會進一步減慢查詢速度。 O(n)在任何計算機科學應用程序中都被認爲是可接受的。然而,在數據庫中,我們測量的時間爲&讀取/寫入次數。這是大量的讀取操作,可能需要很長時間才能執行。所以這是不可接受的。

相關問題