【发布时间】:2023-04-02 17:15:02
【问题描述】:
概览:
我有三个表 1) 订阅者、简历和衬衫尺码,我需要找到没有简历或衬衫尺码的订阅者
表格的布局如
订阅者
| season_id | user_id |
简介
| bio_id | user_id |
衬衫尺码
| bio_id | shirtsize |
而且我需要找到所有给定季节没有个人简历或衬衫尺码的用户(如果没有个人简历;则通过关系没有衬衫尺码)。
我最初写了这样一个查询:
SELECT *
FROM subscribers s
LEFT JOIN bio b ON b.user_id = subscribers.user_id
LEFT JOIN shirtsizes ON shirtsize.bio_id = bio.bio_id
WHERE s.season_id = 185181 AND (bio.bio_id IS NULL OR shirtsize.size IS NULL);
但现在需要 10 秒才能完成。
我想知道如何重组查询(或可能是问题),以便它能够合理地执行。
这里是 mysql 解释:(ogu = 订阅者,b = bio,tn = shirtshize)
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------------+--------+-------------+
| 1 | SIMPLE | ogu | ref | PRIMARY | PRIMARY | 4 | const | 133 | Using where |
| 1 | SIMPLE | b | index | NULL | PRIMARY | 8 | NULL | 187644 | Using index |
| 1 | SIMPLE | tn | ref | nid | nid | 4 | waka2.b.nid | 1 | Using where |
上面的内容很干净,这里是realz信息:
mysql> DESCRIBE subscribers
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| subscribers | int(11) | NO | PRI | | |
| uid | int(11) | NO | PRI | | |
mysql> DESCRIBE bio;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| bio_id | int(10) unsigned | NO | PRI | 0 | |
| uid | int(10) unsigned | NO | PRI | 0 | |
mysql> DESCRIBE shirtsize;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| bio_id | int(10) unsigned | NO | PRI | 0 | |
| shirtsize | int(10) unsigned | NO | PRI | 0 | |
真正的查询看起来像:
SELECT ogu.nid, ogu.is_active, ogu.uid, b.nid AS bio_node, tn.nid AS size
FROM og_uid ogu
LEFT JOIN bio b ON b.uid = ogu.uid
LEFT JOIN term_node tn ON tn.nid = b.nid
WHERE ogu.nid = 185033 AND ogu.is_admin = 0
AND (b.nid IS NULL OR tn.tid IS NULL)
nid 是 season_id 或 bio_id(带有类型); term_node 将是衬衫尺寸
【问题讨论】:
-
这些表有索引吗?
-
@jskulksi:我们可以要求您为每个表添加“SHOW CREATE TABLE”输出吗?
标签: sql optimization join