Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 是否有优化此查询的建议_Mysql_Sql_Optimization_Sql Update - Fatal编程技术网

Mysql 是否有优化此查询的建议

Mysql 是否有优化此查询的建议,mysql,sql,optimization,sql-update,Mysql,Sql,Optimization,Sql Update,我使用的是MySQL 5.5,我有以下sql: UPDATE t SET val = 1 WHERE id IN ( SELECT id FROM temp1); UPDATE t SET val = 2 WHERE id IN ( SELECT id FROM temp2 ); UPDATE t SET val = 3 WHERE id IN ( SELECT id FROM temp3 ); UPDATE t SET val = 4 WHERE id IN ( SELECT id F

我使用的是MySQL 5.5,我有以下sql:

UPDATE t SET val = 1  WHERE id IN ( SELECT id FROM temp1);
UPDATE t SET val = 2  WHERE id IN ( SELECT id FROM temp2 );
UPDATE t SET val = 3  WHERE id IN ( SELECT id FROM temp3 );
UPDATE t SET val = 4  WHERE id IN ( SELECT id FROM temp4 );
UPDATE t SET val = 5  WHERE id IN ( SELECT id FROM temp5 );
UPDATE t SET val = 6  WHERE id IN ( SELECT id FROM temp6 );
UPDATE t SET val = 7  WHERE id IN ( SELECT id FROM temp7 );
UPDATE t SET val = 8  WHERE id IN ( SELECT id FROM temp8 );
UPDATE t SET val = 9  WHERE id IN ( SELECT id FROM temp9 );
UPDATE t SET val = 10 WHERE id IN ( SELECT id FROM temp10 );
temp是我使用的临时表,该表有大约10k个条目,完成此sql语句的执行大约需要30秒。此外,临时表中所有项目的总和等于t中的项目数

我能就如何优化这一点提出一些建议吗


谢谢。

首先检查t上是否有索引,因为id列的主键是最好的索引

然后尝试使用以下方法对您的变体进行基准测试:

一,

二,


共享临时表的填充方式。我们可以将其简化为从源数据提取的单个查询。这将更加有效,因为它将能够使用源数据的索引并适合单个原子操作。关系数据库的主要问题是查看特定值是否在表中,要做到这一点,您必须将您的值与表中的所有值进行比较,所以您必须进行多达N次的比较。并没有其他方法,因为我们必须确定表中的值是否存在。但若我们在表中有排序的值,我们可以使用技巧二进制搜索,这只需要log2N比较,但数据必须排序。因此,如果您有1024个值,那么您可以有1024个cmp,或者log21024=10cmp,快100倍
update t, (
select 1 as v, id from temp1
union all
select 2, id from temp2
...
) as q set val=q.v where t.id=q.id
truncate table t; -- note deletion of all from table t
insert into t (id, val)
select id, val from temp1
union all
select id, val from temp2
...