如何在mysql中创建高效的多对多关系索引

3bygqnnd  于 2023-05-05  发布在  Mysql
关注(0)|答案(1)|浏览(180)

以下是我的用例:我有两张table:jobemployee使用如下多对多关系连接(我跳过了与问题无关的字段):

CREATE TABLE jobs (
    id INT,
    status ENUM('todo', 'in-progress', 'done')
);

CREATE TABLE employees (
    id INT
);

CREATE TABLE pivot (
  id INT
  job_id INT
  employee_id INT
);

现在我需要提取当前正在进行的工作:

SELECT j.*
FROM jobs j
JOIN pivot p ON p.job_id = j.id
WHERE p.employee_id = 123
AND j.status = "in-progress"

问题是规模。由于我必须保留历史数据,因此在jobs中将有超过10 million的行是done(在pivot中甚至更多)。因此,虽然这个选择通常会返回一到两行,但jobs.status上的索引和pivot.employee_id上的索引都将返回大量的行。
有没有办法创建一个同时包含jobs.statuspivot.employee_id的索引来提高上述查询的性能?

5fjcxozz

5fjcxozz1#

你不能在MySQL中创建跨多个表的索引。
下面是我创建的索引:

ALTER TABLE pivot 
  ADD PRIMARY KEY (job_id, employee_id),
  ADD KEY (employee_id, job_id),
  DROP COLUMN id;

ALTER TABLE jobs
  ADD PRIMARY KEY (id),
  ADD KEY (status);

ALTER TABLE employees
  ADD PRIMARY KEY (id);

pivot.id列可能是不必要的,因为其他两列加在一起就是合适的主键。

相关问题