2014-10-05 45 views
0

我可以加快此查詢,使其更快?現在它需要51秒。加快MySQL查詢,檢查重複值與不匹配的值和更新

UPDATE tbl_user_tmp tut 
    INNER JOIN tbl_user_tmp tut1 ON tut.name = tut1.name 
    SET tut.image = '1', tut1.image='1' 
    WHERE tut.image = 0 AND tut1.image=1 and tut.user = 'user' and tut1.user = 'user' 

我試着去找到具有相同名稱和更新圖像entires如果一個名稱有圖像,等於0,另一個等於1

林不能夠把索引放在這張桌子上,因爲它的更新和插入由我的網站上的用戶。根據我的理解,添加索引會減慢查詢速度。我需要它很快。這真的是我唯一引起問題的查詢。所以希望找出一種方法,而不必索引。

+0

你有'name'列嗎?你有沒有檢查你的執行計劃?它也取決於表格的大小。你正在嵌套你的查詢,看起來好像它可能正在處理大量的表格。可能是這種情況?請嘗試對(0,1)和user ='user''中的圖像進行計數,並將其與總行數進行比較。 – 2014-10-05 18:31:05

+0

已更新的問題。 – Bignadad 2014-10-05 18:33:34

+0

'UPDATE tbl_user_tmp tut SET tut.image ='1'where tut.image = 0和tut.user ='user'和tut.name in(從tbl_user_tmp中選擇名稱,其中image = 1和user ='user 「)'? (沒有辦法在我身邊測試它,但是...) – 2014-10-05 18:42:40

回答

0

如果內存和寫入性能不是問題,最簡單的方法就是把指標上限制列(nameimageuser

更新(在回答@ Bignadad的更新):指數將放緩INSERTUPDATE查詢。然而,這可能不會在小範圍內引人注目。如果你真的需要高讀寫性能比你可能不得不看其他解決方案,如緩存或單獨的表。

1

這是查詢:

UPDATE tbl_user_tmp tut INNER JOIN 
     tbl_user_tmp tut1 
     ON tut.name = tut1.name 
    SET tut.image = 1, 
     tut1.image = 1 
    WHERE tut.image = 0 AND tut1.image = 1 and tut.user = 'user' and tut1.user = 'user'; 

指標將有助於此查詢。我會建議:

create index idx_tbl_user_tmp_1 on tbl_user_tmp(image, user, name) 
create index idx_tbl_user_tmp_2 on tbl_user_tmp(name, image, user) 
0

這是在問題的更新版本後面寫的答案。

放置索引確實會減慢像UPDATE, INSERT, DELETE這樣的查詢,但這可能對您而言並不明顯。想象一下:我有一張大約10毫米行的表,每分鐘有人INSERTUPDATE,我也有大約5列的索引。在大多數情況下,這並不是什麼大問題。

如果性能確實是關鍵,那麼您應該爲不同的值分別創建image的表格,如果表格真的很大,請嘗試進行分區或按照原樣進行分區。

由於您沒有給出我要求的每個細節(執行計劃),行數等,所以我可以建議。

0

一些選項:

1)檢查tbl_user_tmp.name是一個索引

2)更好,但如果你要經常做這樣的事情,介紹了(名稱,用戶)

一個複合索引

3),具有指數不大幅放緩添加新條目到表(除非它已經擁有超過10萬項)

4)試試這個:

update tbl_user_tmp tut1,tbl_user_tmp tut2 
    set tut1.image=1 
    where tut1.name=tut2.name and tut1.user=tut2.user 
    and tut1.image=0 and tut2.image=1; 

SQL小提琴:http://sqlfiddle.com/#!2/f03f2/1

5)你是否真的需要名稱來標識用戶?如果只有「user」字段就足夠了,那麼從查詢中刪除「name」(加入字符串應該很慢,特別是如果這些字符串不在索引中)。