如何使用子选择优化删除查询?

时间:2019-01-10 19:43:34

标签: mysql sql query-optimization

此查询需要从包含2000万的表中删除超过1700万行。

user@pc:~ $ alias e='echo alias is set'
user@pc:~ $ e
alias is set
user@pc:~ $ vim pygitup.sh
user@pc:~ $ cat pygitup.sh 
#!/bin/bash
e
user@pc:~ $
user@pc:~ $ ./pygitup.sh 
./pygitup.sh: line 2: e: command not found
user@pc:~ $ 
user@pc:~ $ 
user@pc:~ $ . ./pygitup.sh       # <--- notice the leading dot
alias is set
user@pc:~ $ 

要花几个小时才能运行,我是否缺少可以加快速度的东西?

子选择本身要花几秒钟,我不明白为什么删除要花这么长时间。

3 个答案:

答案 0 :(得分:1)

如果要删除的太多,请执行。 我建议您:

  1. 使用将保留的数据创建新的临时表。
  2. 截断主表
  3. 将数据从临时表移至主表

  1. 使用将保留的数据创建新的临时表。
  2. 删除主表
  3. 将Temp表重命名为主表(不要忘记创建约束)

也用于查询

切勿对BIG数据使用IN子句。而是使用性能更高的

基本脚本:

CREATE TABLE tmp_statements as
  SELECT * FROM statements s where exists 
  (
     select 1 FROM agreements a 
     WHERE 
       created < DATE_SUB(CURDATE(), INTERVAL 6  MONTH AND
       s.agreement_id = a.agreement_id
  ));

 DROP TABLE statements;

 RENAME TABLE tmp_statements TO statements ;

 --DONT FORGET TO RECREATE  CREATE YOUR INDEXES, CONSTRAINTS;

答案 1 :(得分:1)

尝试重写第一条语句以使用Error response from daemon: Get https://registry-1.docker.io/v2/: http: server gave HTTP response to HTTPS client

EXISTS

然后在DELETE FROM statements WHERE EXISTS (SELECT * FROM agreements WHERE agreements.id = statements.aggreement_id AND agreements.created < date_sub(curdate(), interval 6 month)); 上添加索引(如果尚未放置)。

agreements (id, created)

第二个在CREATE INDEX agreements_id_created ON agreements (id, created); 上创建一个索引(如果还没有的话)。

agreements (created)

答案 2 :(得分:1)

使用“多表删除”代替通常效率不高的const {getproduct} = require('./webScrapper/getproduct'); let main = async () => { let product = await getproduct('https://www.americanas.com.br/produto/134118928'); console.log('product:', product); } main();

讨论了一些用于大删除的技术here

要删除表的85%,实际上最好用保留的15%新建一个表,然后将表交换到位。 (有关更多信息,请参见上面的链接。)