繁体   English   中英

MySQL 索引可有效查询具有多对多关系的表连接

[英]MySQL indexing to efficiently query table join with many to many relationship

我一直在努力创建正确的索引以提高我们在数据库上运行的特定查询的性能,我希望你们中的一个人可以帮助我指明正确的方向。

我有 2 张桌子,如下所示。 我有一个查询来查找属于特定类别的公司的所有员工,例如 first_name 像“Be%”。 我尝试在category_id, company_id上创建多个索引category_id, company_id但这没有帮助。 为我的表建立索引以实现此查询的更好性能的正确方法应该是什么? 先感谢您。

SELECT 
  e.* 
FROM employee e
INNER JOIN company c ON e.company_id = c.company_id
WHERE c.category_id = 6
AND e.first_name LIKE "Be%"
GROUP BY e.employee_id

表公司

| company_id | category_id |
+------------+-------------+
| ...        | ...         |
+------------+-------------+
| 47         | 6           |
+------------+-------------+
| ..         | ...         |
+------------+-------------+
| 252        | 6           |
+------------+-------------+

表员工

| employee_id | company_id | first_name | ... |
+-------------+------------+------------+-----+
| 2582250     | 47         | Ben        | ... |
+-------------+------------+------------+-----+
| 3447890     | 252        | Ryan       | ... |
+-------------+------------+------------+-----+
| 7125966     | 252        | Beth       | ... |
+-------------+------------+------------+-----+
| ...         | ...        | ...        | ... |
+-------------+------------+------------+-----+

创建下面的表和sqlfiddle

CREATE TABLE company (
  `company_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `category_id` INT UNSIGNED NOT NULL DEFAULT 0
) ENGINE=InnoDB;

CREATE TABLE employee (
  `employee_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `company_id` INT UNSIGNED NOT NULL,
  `first_name` VARCHAR(255)
) ENGINE=InnoDB;

必须在多:多表中有索引。 遵循此处概述的建议。

WHERE c.category_id = 6
  AND e.first_name LIKE "Be%"

需要

c: INDEX(category_id, company_id) -- which will be called for in the link above
e: INDEX(first_name, employee_id)

优化器将从c开始,然后进入e 或相反亦然。 我为您提供了任一方向的最佳索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM