2013-11-28 24 views
0

我在Windows 2008服務器中使用MySQL 5.1版本。當我執行以下查詢時:選擇*從<tablename>不使用任何密鑰

SELECT * FROM tablename;

獲取該表中的所有結果花費的時間太多。此查詢也在慢速查詢日誌中列出,而此表具有主鍵以及更少的索引。 我執行下面的查詢來檢查執行計劃:

explain extended select * from tablename;

我發現下面的信息:

id=1 
select_type=SIMPLE 
table=tablename 
possible_keys=null 
key=null 
key_len=null 
ref=null 
rows=85151 
Extra=blank 

我認爲它應該查詢默認情況下,至少使用主鍵。同樣,我在下面執行查詢,發現過濾列有值= 100.0

explain extended select * from tablenmae;

是否有關於爲什麼查詢不使用任何鍵具體的原因?

+1

爲什麼要使用「鑰匙」?你想從表格中得到所有*,所以沒有辦法使用索引(我認爲你的意思是「鍵」)會加速任何事情。 –

回答

0

爲什麼在沒有過濾器的情況下使用密鑰? - 在這種單表查詢中,表掃描的速度至少不會那麼快。

爲了解決您的性能問題,可能您的客戶端處理可能會傳遞給服務器(畢竟,您並不真正向最終用戶顯示85,151行,是嗎?) - 或者獲取更快的磁盤...

+0

不知道爲什麼這會吸引匿名downvote? –

1

您正在選擇表中的所有行。這就是爲什麼需要掃描整個表格(所有行)的原因。

僅當縮小搜索範圍(使用where)時纔會使用密鑰(或索引)。在這種情況下,使用索引來預先選擇您想要的行,而不必實際掃描整個表中的給定條件。

如果您不需要一次訪問所有行,請嘗試使用LIMIT限制返回的行。

SELECT * FROM tablename LIMIT 100; 

如果你想在未來100行,請使用

SELECT * FROM tablename LIMIT 100,100; 

等。

除了這種方法(稱爲「分頁」),你可以做很多事情來加快這個查詢(除了獲得更快的機器,更多的RAM,更快的磁盤,更好的網絡,如果DMBS是遠程訪問)。

如果您需要進行一些處理,請考慮將邏輯(例如過濾)移動到DBMS。這可以使用查詢的WHERE部分來實現。

+0

如果我添加列名代替*,它有多大幫助? – ursitesion

+0

沒有,如果你把所有的列名,我害怕。 如果你把一些(不是全部)列名在技術上,你會得到最小的改進,但只是因爲DBMS必須通過連接移動更少的數據。但是這種效應更多的是理論性質。 它遍歷所有的表格,這裏是最貴的。 –