联表情况下如何建立索引?
以下sql语句
explain SELECT t.id FROM task t INNER JOIN task_project tp ON t.id = tp.task_id WHERE t.task_type = '5' AND t.start_time < '2021-1-17 11:28:47' AND t.end_time > '2021-1-17 11:28:47' AND tp.project_id = 15520;
基本知识 https://www.cnblogs.com/xueqiuqiu/articles/10517498.html
mysql联表查询,会预估结果集来选择驱动表,驱动表就是使用该表去关联其他表; 驱动表关联被驱动表的逻辑
- 根据where筛选条件,选出驱动表的一条数据,然后将此记录关联到被驱动表(on条件)
- 如果被驱动表的on条件字段是索引,那么根据该索引映射到主键,用主键查询被驱动表获取结果进行聚合;如果不是索引,则根据条件全表扫描被驱动表;
- 聚合完成之后继续取驱动表下一条数据
- 重复以上过程
task 和 taskproject只有主键
task_project 给task_id和project_id建立索引;
先是task_id
再接着继续建立project_id索引
再给时间建立组合索引
两个值都可以建立索引,是否要将他们建立和组合索引?
1.如果他们是一起出现的,并且具有查询的顺序(最左原则),那么可以组合;如果各自都有查询的情况,组合的话会导致右边的字段无法被索引;所以要看具体场景;