连接列和where列的mysql连接索引

连接列和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执行多个单索引?还

我试图理解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执行多个单索引?还是有其他方法可以做到这一点

如何为表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         │
└────────────┴────────────┘