2014-10-05 48 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”(加入字符串应该很慢,特别是如果这些字符串不在索引中)。