首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有在找到一行时才删除

只有在找到一行时才删除
EN

Stack Overflow用户
提问于 2020-10-31 06:01:40
回答 4查看 96关注 0票数 0

我有一个嵌套查询,只有在definitions.term_id中找到一行时,才能以表的形式删除一行。它可以工作,但在我的系统上需要大约9秒。我希望优化查询。

代码语言:javascript
复制
DELETE FROM terms 
WHERE id 
IN(
    SELECT term_id 
    FROM definitions 
    WHERE term_id = 1234 
    GROUP BY term_id 
    HAVING COUNT(term_id) = 1
    )

数据库只有大约4000行。如果我将查询分为两个独立的查询,则每个查询的开销约为0.1

术语

代码语言:javascript
复制
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| term  | varchar(50)      | YES  |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+

定义

代码语言:javascript
复制
+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id             | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| term_id        | int(11)          | YES  |     | NULL    |                |
| definition     | varchar(500)     | YES  |     | NULL    |                |
| example        | varchar(500)     | YES  |     | NULL    |                |
| submitter_name | varchar(50)      | YES  |     | NULL    |                |
| approved       | int(1)           | YES  | MUL | 0       |                |
| created_at     | timestamp        | YES  |     | NULL    |                |
| updated_at     | timestamp        | YES  |     | NULL    |                |
| votos          | int(3)           | NO   |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+
EN

回答 4

Stack Overflow用户

发布于 2020-10-31 06:04:59

为了加快这一进程,请考虑在相关字段上创建一个索引:

代码语言:javascript
复制
CREATE INDEX term_id ON terms (term_id)
票数 2
EN

Stack Overflow用户

发布于 2020-10-31 06:45:02

如何使用关联子查询使用exists和尝试,

代码语言:javascript
复制
DELETE FROM terms t
WHERE id = 1234
  AND EXISTS (SELECT 1 
                FROM definitions d
               WHERE d.term_id = t.term_id 
               GROUP BY term_id 
               HAVING COUNT(term_id) = 1)
票数 1
EN

Stack Overflow用户

发布于 2020-10-31 08:15:24

创建一个只保留希望保留的行的新表通常更快。尽管如此,我可能会这样写,并提供适当的索引。

代码语言:javascript
复制
DELETE 
  FROM terms t
  JOIN 
      ( SELECT term_id 
          FROM definitions 
         WHERE term_id = 1234 
         GROUP 
            BY term_id 
        HAVING COUNT(*) = 1
      ) x
    ON x.term_id = t.id 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64618883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档