2012-01-05 142 views
0

我有一個非常大的圖像數據庫,我需要運行更新來增加圖像的查看計數。每個小時都有超過一百萬個獨特的行需要更新。現在運行這個查詢需要大約一個小時,無論如何要讓這個運行速度更快?MySQL查詢優化大表

我創建一個內存表:

insert low_priority into tmp_views_table 
values ('key', 'count'),('key', 'count'),('key', 'count'), etc... 

CREATE TABLE IF NOT EXISTS tmp_views_table (
    key VARCHAR(7) NOT NULL, 
    views INT NOT NULL, 
    primary key (`key`) 
) ENGINE = MEMORY 

然後我使用運行,直到所有的意見已插入存儲表中的循環插入在同一時間觀看1000次

然後我運行的實際表的更新是這樣的:

update images, tmp_views_table 
set images.views = images.views+tmp_views_table.views 
where images.key = tmp_views_table.key 

這最後一次更新是一個是TA國王一個小時左右,內存表的東西運行得非常快。

有沒有更快的方法,我可以做這個更新?

+1

數字ID比varchar更有意義。另外,你的表格是否被索引? – 2012-01-05 18:37:56

+0

我不確定內存表的索引在哪裏保存,但是它們不會減慢這些插入/更新操作,特別是在** MEMORY **引擎的情況下? – Rolice 2012-01-05 18:58:20

+0

@OliCharlesworth id是一個散列,所以它包含字母和數字,是的主鍵是關鍵或散列 – Brian 2012-01-05 18:58:49

回答

1

你在使用Innodb嗎?嘗試對mysql和innodb引擎進行一般調整,以實現更快的數據更改。

我想你有key字段的images表的索引。你可以嘗試你的更新查詢也沒有索引的內存表 - 在這種情況下,查詢優化器應該選擇內存表的全表掃描。

我從來沒有使用UPDATE語句連接,所以我不知道它是否被執行,但也許JOIN需要很長時間。也許你可以發佈該查詢的EXPLAIN結果。

下面是我在一個項目中用來做類似事情 - 將實時數據插入/更新到臨時表並將其合併到聚集表,每天一次,因此可以嘗試它是否會更快地執行。

 
INSERT INTO st_views_agg (pageid,pagetype,day,count) 
    SELECT pageid,pagetype,DATE(`when`) AS day, COUNT(*) AS count FROM st_views_pending WHERE (pagetype=4) GROUP BY pageid,pagetype,day 
    ON DUPLICATE KEY UPDATE count=count+VALUES(count);