在连接表中使用min或max时的MySQL / Percona UPDATE性能

时间:2017-02-22 14:15:12

标签: php mysql join

以下查询在5s中运行:

UPDATE table1 li inner JOIN (SELECT min(c.id_table1 ) as id
        FROM table2 l
                JOIN table3 c ON c.id_table2 = l.id AND c.date = '2016-01-01'
                JOIN bloc_table b ON b.id = l.id_bloc_table and b.reference = '2568548'
                JOIN code_client a ON a.id_code_client = c.id_code_client AND ( a.label = 'C' OR a.label LIKE 'C %')
        WHERE c.hour IS NULL) t1
        ON li.id_ligne_c = t1.id
        SET li.hour = '11:18'

以下是解释:

id select_type表分区类型possible_keys键key_len ref行过滤额外的
1 UPDATE NULL NULL NULL NULL NULL NULL NULL NULL NULL表中没有匹配的行
2 DERIVED l NULL索引PRIMARY,unique_table2,fk_table2_bloc_table fk_table2_bloc_table 4 NULL 2719403 100.00使用索引
2 DERIVED c NULL eq_ref fk_table3_table2,key_table3_1,key_table3_6,fk_table3_code_client fk_table3_table2 4 mydb.l.id_table2 1 5.00使用位置
2 DERIVED b NULL eq_ref PRIMARY,unique_bloc_table,key_bloc_table,fk_bloc_table_client_file PRIMARY 4 mydb.l.id_bloc_table 1 5.00使用位置
2 DERIVED a NULL eq_ref PRIMARY,unique_code_client_libelle PRIMARY 1 mydb.c.id_code_client 1 5.00使用位置
2 DERIVED r NULL eq_ref PRIMARY,unique_client_item PRIMARY 2 mydb.b.id_client_file 1 100.00使用位置

以下内容在0.00001s中运行:

UPDATE table1 li inner JOIN (SELECT c.id_table1 as id
        FROM table2 l
                JOIN table3 c ON c.id_table2 = l.id AND c.date = '2016-01-01'
                JOIN bloc_table b ON b.id = l.id_bloc_table and b.reference = '2568548'
                JOIN code_client a ON a.id_code_client = c.id_code_client AND ( a.label = 'C' OR a.label LIKE 'C %')
        WHERE c.hour IS NULL) t1
        ON li.id_ligne_c = t1.id
        SET li.hour = '11:18'

以下是解释:

id select_type表分区类型possible_keys键key_len ref行过滤额外的
1 SIMPLE b NULL ref PRIMARY,unique_bloc_table,key_bloc_table,fk_bloc_table_client_file key_bloc_table 4 const 1 100.00 NULL
1 SIMPLE r NULL eq_ref PRIMARY,unique_client_item PRIMARY 2 mydb.b.id_client_file 1 100.00使用位置
1 SIMPLE一个NULL范围PRIMARY,unique_code_client_libelle unique_code_client_libelle 14 NULL 1 100.00使用where;使用索引
1 SIMPLE l NULL ref PRIMARY,unique_table2,fk_table2_bloc_table unique_table2 4 mydb.b.id_bloc_table 6 100.00使用索引
1 SIMPLE c NULL eq_ref PRIMARY,fk_table3_table2,key_table3_1,key_table3_6,fk_table3_code_client fk_table3_table2 4 mydb.l.id_table2 1 5.00使用位置
1 UPDATE li NULL eq_ref PRIMARY PRIMARY 4 mydb.c.id_ligne_c 1 100.00 NULL

唯一的区别是使用“MIN”作为一次只更新1行的方法,以防同一客户端出现多次,以不同的顺序放置不同的项目。

我正在使用percona DB v5.7.17-11

如何一次只选择一行,我如何才能达到相同的性能(0.00001s Vs 5s)?

连接或where子句中使用的所有字段都已编入索引。

由于

0 个答案:

没有答案