加速MySQL查询,检查具有不匹配值和更新的重复项

时间:2014-10-05 18:27:21

标签: mysql

我可以加快此查询速度以加快速度吗?现在它需要51秒。

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。

我无法在此表上放置索引,因为它已更新并由我的网站上的用户插入。从我的理解添加索引将减慢这些查询。我需要它快速。这实际上是我唯一导致问题的查询。所以希望找出一种无需索引的方法。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果不考虑内存和写入性能,最简单的解决方案是将索引放在限制列(nameimageuser)上

更新(回答@Bignadad' s更新):索引会减慢INSERTUPDATE次查询速度。然而,这可能在小规模上并不明显。如果您确实需要高读取写入性能,那么您可能需要查看其他解决方案,例如缓存或单独的表。

答案 2 :(得分:0)

这是在您更新的问题版本之后写的答案。

放置索引确实会减慢UPDATE, INSERT, DELETE之类的查询速度,但这对您来说甚至可能都不会引起注意。想象一下:我有一个大约10mln行的表,每分钟人们INSERTUPDATE,我也有大约5列的索引。在大多数情况下,这并不是一件大事。

如果性能确实是关键,那么你应该为image的不同值制作单独的表,如果表格非常大,请尝试分区,或者只是保持原样。

由于您没有给出我要求的每个细节(执行计划),行数等,这是我可以建议的。

答案 3 :(得分:0)

一些选项:

1)检查tbl_user_tmp.name是否为索引

2)更好的是,如果你要经常做这样的事情,为(名字,用户)引入复合索引

3)拥有索引不应该大幅减慢向表中添加新条目的速度(除非它已经有超过100K条目)

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