我可以加快此查询速度以加快速度吗?现在它需要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。
我无法在此表上放置索引,因为它已更新并由我的网站上的用户插入。从我的理解添加索引将减慢这些查询。我需要它快速。这实际上是我唯一导致问题的查询。所以希望找出一种无需索引的方法。
答案 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)
如果不考虑内存和写入性能,最简单的解决方案是将索引放在限制列(name
,image
和user
)上
更新(回答@Bignadad' s更新):索引会减慢INSERT
和UPDATE
次查询速度。然而,这可能在小规模上并不明显。如果您确实需要高读取和写入性能,那么您可能需要查看其他解决方案,例如缓存或单独的表。
答案 2 :(得分:0)
这是在您更新的问题版本之后写的答案。
放置索引确实会减慢UPDATE, INSERT, DELETE
之类的查询速度,但这对您来说甚至可能都不会引起注意。想象一下:我有一个大约10mln行的表,每分钟人们INSERT
和UPDATE
,我也有大约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”(加入字符串应该很慢,特别是如果这些字符串不在索引中)。