Maw*_*awg 3 mysql sql join query-optimization
我有一群候选人,他们有过一个或多个工作,每个人都在一家公司,使用一些技能。
糟糕的 ascii 艺术如下:
--------------- ---------------
| candidate 1 | | candidate 2 |
--------------- \ --------------
/ \ |
------- -------- etc
|job 1| | job 2 |
------- ---------
/ \ / \
--------- --------- --------- --------
|company | | skills | |company | | skills |
--------- --------- ---------- ----------
Run Code Online (Sandbox Code Playgroud)
这是我的数据库:
mysql> describe jobs;
+--------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+----------------+
| job_id | int(11) | NO | PRI | NULL | auto_increment |
| candidate_id | int(11) | NO | MUL | NULL | |
| company_id | int(11) | NO | MUL | NULL | |
| start_date | date | NO | MUL | NULL | |
| end_date | date | NO | MUL | NULL | |
+--------------+---------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
.
mysql> describe candidates;
+----------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+----------+------+-----+---------+----------------+
| candidate_id | int(11) | NO | PRI | NULL | auto_increment |
| candidate_name | char(50) | NO | MUL | NULL | |
| home_city | char(50) | NO | MUL | NULL | |
+----------------+----------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
.
mysql> describe companies;
+-------------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+---------------+------+-----+---------+----------------+
| company_id | int(11) | NO | PRI | NULL | auto_increment |
| company_name | char(50) | NO | MUL | NULL | |
| company_city | char(50) | NO | MUL | NULL | |
| company_post_code | char(50) | NO | | NULL | |
| latitude | decimal(11,8) | NO | | NULL | |
| longitude | decimal(11,8) | NO | | NULL | |
+-------------------+---------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
.
mysql> describe skills;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| skill_id | int(11) | NO | MUL | NULL | |
| job_id | int(11) | NO | MUL | NULL | |
+----------+---------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
.
mysql> describe skill_names;
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| skill_id | int(11) | NO | PRI | NULL | auto_increment |
| skill_name | char(32) | NO | MUL | NULL | |
+------------+----------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
这是我对查询的尝试(请注意,我打算将通配符更改为字段名称;我只是想让某些东西正常工作):
SELECT can.* , co.*, j.*, sn.*
FROM candidates AS can
JOIN jobs AS j
JOIN companies AS co ON j.company_id = co.company_id
JOIN skills AS s ON s.job_id = j.job_id
JOIN skill_names AS sn ON s.skill_id = s.skill_id
Run Code Online (Sandbox Code Playgroud)
HediSql 说 /* Affected rows: 0 Found rows: 34,461,651 Warnings: 0 Duration for 1 query: 0.000 sec. (+ 105.078 sec. network) */
查询有什么问题?我希望从糟糕的 ascii 艺术中可以清楚地看到我想要实现的目标。
(另外,我加入表的顺序是否会产生任何速度差异?我会担心新的 MySql v8 函数稍后将它作为嵌套的 JSON 检索)
您缺少candidatesand之间的连接条件jobs,因此您会在两个表之间获得笛卡尔积。此外, 上的连接条件存在问题skill_names,其中两列相同(这再次生成笛卡尔积)。
SELECT can.* , co.*, j.*, sn.*
FROM candidates AS can
JOIN jobs AS j ON j.candidate_id = can.candidate_id --> here: missing join condition
JOIN companies AS co ON j.company_id = co.company_id
JOIN skills AS s ON s.job_id = j.job_id
JOIN skill_names AS sn ON sn.skill_id = s.skill_id --> and here: wrong join condition
Run Code Online (Sandbox Code Playgroud)
许多 RDBMS 会在JOIN没有ON子句的情况下引发语法错误(如果您确实想要笛卡尔积,则需要使用 明确说明它CROSS JOIN),但是,唉,不是 MySQL。
当谈到这个问题时:
我加入表格的顺序对速度有影响吗?
不。只要您使用inner join的是s(不是left joins),连接顺序对查询规划器来说无关紧要,它会按照它认为更有效的顺序重新排列它们。
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |