连接列和where列的mysql连接索引
我试图理解MySQL是如何使用索引作为连接条件以及where条件的。如果我进行了如下连接:连接列和where列的mysql连接索引,mysql,join,indexing,Mysql,Join,Indexing,我试图理解MySQL是如何使用索引作为连接条件以及where条件的。如果我进行了如下连接: SELECT * from Table1 inner join table2 on Table1.colA = Table2.colB where Table2.colC > val1 and Table2.colC < val2; 如何为表1和表2编制索引,以便它高效地执行此查询 我是否需要对Table1.colA、Table2.colB和Table2.colC执行多个单索引?还
SELECT * from Table1
inner join table2 on Table1.colA = Table2.colB
where Table2.colC > val1
and Table2.colC < val2;
如何为表1和表2编制索引,以便它高效地执行此查询
我是否需要对Table1.colA、Table2.colB和Table2.colC执行多个单索引?还是有其他方法可以做到这一点
如何为表1和表2编制索引,以便它高效地执行此查询
将每个表中的第一列设置为PK/AI主键/自动递增
然后,当您需要将它们连接在一起时,您可以在tableB.colB linkToA或simple idA中命名第二列。这听起来有点令人困惑,下面是一个实际的例子:
你有一桌学生和老师
学生桌
教师表
现在假设你需要找到老师年龄在25到35岁之间的学生
SELECT s.name AS student_name, t.name AS teacher_name
FROM students s
INNER JOIN teachers t ON s.teacher_id = t.id
WHERE t.age > 25 AND t.age < 35;
您应该索引连接列和WHERE中使用的列,所以是的。尝试在表2中创建复合索引colB,colC。然后测试性能并运行EXPLAIN。然后对索引colC,ColB执行相同的操作。然后,请给我们展示结果。不幸的是,我简化了一个生产示例。我试图提高效率的表是一个73M行的表,它有27GB大,我没有权限动态添加索引。我需要请求我们的DBA这样做,我需要事先证明索引会有所帮助。所以,很不幸,实验不是一个选择。这种查询通常通过复合覆盖索引来帮助查找。了解完整的查询和表布局对于建议适当的索引非常重要。但有一件事是肯定的。您正在对Table2.ColC进行范围扫描。你能提供更多细节吗?问题中的查询要求对colC进行范围扫描。我不确定这个答案是否考虑到了这一点。谢谢@rick6,但我问的是关于在有join和where子句的表上建立索引的问题。我会用什么索引来帮助你的例子,特别是在t.age专栏上?@Steve没问题;我想我是通过要求您将两个表上的id设置为PK/AI来解决这个问题的?主键是索引的另一个词。范围扫描受益于索引。您没有建议对列进行范围扫描。
┌──┬────────────┬───┐
│id│ name │age│
├──┼────────────┼───┤
│1 │Jan │34 │
├──┼────────────┼───┤
│2 │Alexander │26 │
├──┼────────────┼───┤
│3 │Steve │23 │
├──┼────────────┼───┤
│4 │Joan │56 │
└──┴────────────┴───┘
SELECT s.name AS student_name, t.name AS teacher_name
FROM students s
INNER JOIN teachers t ON s.teacher_id = t.id
WHERE t.age > 25 AND t.age < 35;
┌────────────┬────────────┐
│student_name│teacher_name│
├────────────┼────────────┤
│Jeffrey │Alexander │
├────────────┼────────────┤
│Frankie │Jan │
└────────────┴────────────┘