索引和联接

时间:2017-05-19 16:36:50

标签: mysql join indexing

我知道索引如何适用于表...

但是我想知道如果我在列CustomerID上触发以下连接语句和索引,在这种情况下索引播放任何角色,如果是,那么如何或是否有其他方法来创建索引?

SELECT o.OrderID
     , o.CustomerID
     , c.CustomerName
     , o.OrderDate
  FROM Orders o 
  JOIN Customers c
    ON o.CustomerID = c.CustomerID 
 order 
    by o.CustomerID; 

和表格就像

订单表:

    +----------------------+------------+------------+
    | OrderID              | CustomerID | OrderDate  |
    +----------------------+------------+------------| 
    | 10308                | 2          |1996-09-18  |
    | 10309                | 37         |1996-09-19  |
    | 10310                | 77         |1996-09-20  |
    +----------------------+------------+------------+

客户表:

CustomerID  CustomerName                        ContactName    Country    
         1  Alfreds Futterkiste                 Maria Anders   Germany    
         2  Ana Trujillo Emparedados y helados  Ana Trujillo   Mexico    
         3  Antonio Moreno Taquería             Antonio Moreno Mexico

1 个答案:

答案 0 :(得分:0)

JOINing表时,优化程序首先决定从哪个表开始。在您的特定示例中,没有WHERE,但有一个ORDER BY。因此,优化程序可能决定从表ORDERed开始。 可以避免排序。

假设它以Orders开头以避免排序,您需要Orders

INDEX(CustomerID)

JOIN中的第二个表格是Customers。在查看Customers后进入Orders,您有ON Orders.CustomerID = Customers.CustomerID。因此,您需要Customers

INDEX(CustomerID)

(注意:由于PRIMARY KEY是一个索引,如果您已经INDEX,则无需添加PRIMARY KEY(CustomerID)。如果您向我们展示{{1},这将有所帮助对于每个表。)