【问题标题】:Index and Joins索引和连接
【发布时间】:2017-10-19 21:00:47
【问题描述】:

我知道索引是如何为表工作的...

但我想知道我是否在这种情况下触发了 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

【问题讨论】:

  • 给我们你的预期输出
  • 是的......但我想知道索引在连接语句中是否起任何作用以及如何?
  • explain 语句会告诉你是否使用了索引(很可能会使用)

标签: mysql join indexing


【解决方案1】:

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

假设它以 Orders 开头以试图避免排序,您需要在 Orders 上使用它:

INDEX(CustomerID)

因此,JOIN 中的第二个表是Customers。要在查看 Orders 后访问 Customers,您有 ON Orders.CustomerID = Customers.CustomerID。所以,你需要这个Customers

INDEX(CustomerID)

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

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多