长话短说: 我对 2 个巨大的表有一个查询。它们不是索引。它很慢。因此,我建立索引。它比较慢。为什么这是有道理的?正确的优化方法是什么?
的背景:
我有2张桌子
person,包含人员信息的表 ( id, birthdate)works_inperson,与部门之间的0-N关系;works_in包含id, person_id, department_id.它们是 InnoDB 表,遗憾的是不能选择切换到 MyISAM,因为数据完整性是一项要求。
这两个表很大,除了各自PRIMARY的id.
我正在尝试获取每个部门中最年轻的人的年龄,这是我提出的查询
SELECT MAX(YEAR(person.birthdate)) as max_year, works_in.department as department
FROM person
INNER JOIN works_in
ON works_in.person_id = person.id
WHERE person.birthdate IS NOT NULL
GROUP BY works_in.department
Run Code Online (Sandbox Code Playgroud)
该查询有效,但我对性能不满意,因为运行需要大约 17 秒。这是预料之中的,因为数据很大并且需要写入磁盘,并且它们不是表上的索引。
EXPLAIN对于这个查询给出
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra …Run Code Online (Sandbox Code Playgroud)