我正在連接到一個我無法管理的數據庫,並且我寫了一個查詢,它在兩個表之間進行了左連接 - 一個小一個數量級,大一個數量級。在某些時候,數據庫返回了這個錯誤:做「small_table LEFT JOIN large_table」是不好的做法嗎?
Incorrect key file for table '/tmp/#sql_some_table.MYI'; try to repair it
我聯繫了管理員,我被告知,因爲我做的是左邊的是我得到這個錯誤加入錯誤,我應該從來沒有離開過加入一個小表到一個大表,我應該反轉連接順序。他們給出的理由是,當我按照我的方式完成時,MySQL將嘗試創建一個太大的臨時表,並且查詢將失敗。他們的解決方案在其他地方失敗了,但這並不重要。
我找到了自己的解釋奇怪,所以我跑我的查詢說明:
id = '1'
select_type = 'SIMPLE'
table = 'small_table'
type = 'ALL'
possible_keys = NULL
key = NULL
key_len = NULL
ref = NULL
rows = '23'
Extra = 'Using temporary; Using filesort'
id = '1'
select_type = 'SIMPLE'
table = 'large_table'
type = 'ref'
possible_keys = 'ID,More'
key = 'ID'
key_len = '4'
ref = 'their_db.small_table.ID'
rows = '41983'
Extra = NULL
(在41983行中第二個表是不是對我來說很有趣,我只是需要最新的記錄,這是爲什麼我的查詢在最後有order by large_table.ValueDateTime desc limit 1
。)
我非常小心地按管理員自己告訴我的列進行選擇,應該保存唯一值(因此我假定已編制索引),但似乎他們沒有編制索引那些專欄。
我的問題是 - 按照我做過的方式進行連接('small_table LEFT JOIN large_table')一般的錯誤練習,還是可以通過適當的索引成功執行這樣的查詢?
編輯: 這裏的查詢是什麼樣子(這是不實際的查詢,但類似):
select large_table.ValueDateTime as LastDate,
small_table.DeviceIMEI as IMEI,
small_table.Other_Columns as My_Names,
large_table.Pwr as Voltage,
large_table.Temp as Temperature
from small_table left join large_table on small_table.ID = large_table.ID
where DeviceIMEI = 500
order by ValueDateTime desc
limit 1;
基本上我做的是試圖獲得最新數據,設備,因爲電壓和溫度隨時間而變化。 DeviceIMEI,ID和ValueDateTime應該是唯一的,但沒有索引(就像我之前所說的,我不管理數據庫,我只有讀權限)。
編輯2:
請專注於回答我的實際問題,而不是試圖重寫我的原始查詢。
另一個例子,爲什麼MySQL幾乎是一個很好的RDMS ...我不能相信管理員可以說一些soooo愚蠢:「反向連接命令」。好,當然。 –
尼古拉,你有多少行沒有這個'限制1'? –
@KubaWyrostek如果我刪除了限制1,結果會得到200652行。 –