我有一个嵌套查询,只有在definitions.term_id中找到一行时,才能以表的形式删除一行。它可以工作,但在我的系统上需要大约9秒。我希望优化查询。
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
术语
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| term | varchar(50) | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+定义
+----------------+------------------+------+-----+---------+----------------+
| 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 | |
+----------------+------------------+------+-----+---------+----------------+发布于 2020-10-31 06:04:59
为了加快这一进程,请考虑在相关字段上创建一个索引:
CREATE INDEX term_id ON terms (term_id)发布于 2020-10-31 06:45:02
如何使用关联子查询使用exists和尝试,
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)发布于 2020-10-31 08:15:24
创建一个只保留希望保留的行的新表通常更快。尽管如此,我可能会这样写,并提供适当的索引。
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 https://stackoverflow.com/questions/64618883
复制相似问题