我有一個非常大的MySQL表(68萬行)排序指標,MySQL的非常大的表 - 創造超過24小時
,我嘗試使用下面的查詢,以保持每分鐘一列:
delete bt
from table1 bt
join (select date, min(time) as time
from table1
group by date, hour(time), minute(time)
)
btt
on btt.date = bt.date
and hour(bt.time) = hour(btt.time)
and minute(bt.time) = minute(btt.time)
and btt.time <> bt.time
我的表有查詢運行超過24小時以下的列
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| date | varchar(11) | NO | | NULL | |
| time | varchar(12) | NO | | NULL | |
| gmt_offset | varchar(2) | YES | | NULL | |
| type | varchar(10) | YES | | NULL | |
| yield_b | varchar(10) | YES | | NULL | |
| yield_d | varchar(10) | YES | | NULL | |
+----------------+-------------+------+-----+---------+----------------+
,當我運行
SHOW FULL PROCESSLIST;
國家說
Creating sort index
這是正常的這樣一個查詢,以這麼長的時間?有什麼方法可以加快速度嗎?謝謝 !
編輯:
戈登的答案是正確的,只有一條線有一個小的失誤。下面是確實工作起來比前一個更快的正確的查詢:
create table temp_table1 as
select t.*
from (select t1.*,
(@rn := if(@prevd = date and minute(time) = @prevm, @rn + 1,
if(@prevd := date, if(@prevm := minute(time), 1, 1), 1)
)
) as seqnum
from table1 t1 cross join
(select @rn := 0, @prevd := 0, @prevm := 0) vars
order by date, time
) t
where seqnum = 1;
請說明。從您的查詢看來,您正試圖刪除除了每個不同分鐘中的第一行(最小值「time」)行之外的所有行。那是對的嗎?請顯示您的索引。你有什麼理由必須分開'日期'和'時間'嗎?如果您將它們合併到一個列中,給它一個'DATETIME'數據類型並對它進行索引,那麼您就可以順利地找到一個有效的解決方案。 – 2014-12-03 14:11:38
還有一個問題:id值是隨着日期+時間單調增加的嗎?也就是說,如果一個「id」大於另一個,那麼它是保證它的日期+時間與另一個同時或晚於另一個? – 2014-12-03 14:15:29