如果WHERE子句中没有值,则列的顺序是否在多列索引中很重要

时间:2015-03-03 08:47:06

标签: mysql

我理解需要多列索引,并且索引顺序在请求中很重要,例如

    SELECT product_id 
      FROM order_detail 
     WHERE order_id in (1, 2, 3)

但是,当WHERE子句中没有值时,我无法弄清楚多列索引和索引顺序的必要性。

  1. 我相信多列索引仅在WHERE子句中指定值时使用(我可能错了)。因此,为了“优化”表格 order_detail ,对于下面的请求,应该在product_id和order_id 上创建多列索引,还是应该创建两个单独的索引,一个在order_id上,一个在product_id上:

    SELECT O.order_id, P.product_name 
      FROM order_detail OD, order O, product P 
     WHERE OD.order_id = O.order_id 
       AND P.product_id = OD.product_id    
    
  2. 如果在WHERE子句中的两列上进行搜索时仍然需要多列索引,即使其中没​​有值,为多列提供的正确顺序是什么索引呢? 关于表order_detail的上述示例,我应该使用(order_id,product_id)还是应该使用(product_id,order_id)?当WHERE子句中没有值时,订单是否重要?

  3. 非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

列的顺序很重要。 MySQL可以使用索引(product_id, order_id)进行以下操作:

  • WHERE product_id = 123
  • WHERE product_id = 123 AND order_id = 456

但不是为了:

  • WHERE order_id = 123

值得注意的是MySQL可以选择不使用索引。例如,如果1000个订单中只有10个不同的产品,那么MySQL可以忽略该索引。

我建议首先放置具有更高基数的列。或者更好的是,创建两个索引(product_id, order_idorder_id, product_id)并让MySQL决定使用哪个索引。

答案 1 :(得分:0)

  1. 优化WHERE子句时,只能使用一个索引。因此,如果您要测试多个列,并且希望获得最佳性能,则应使用包含所有(或大多数)列的多列索引。如果您创建两个单独的索引,它将只使用其中一个来优化WHERE条件的那一部分,然后它将必须在这些行中进行扫描以匹配其他条件。

  2. 多列索引可用作前缀中任何列集的索引。因此,如果您在(col1, col2, col3)上有索引,它也会充当col1(col1, col2)的索引。如果您在(order_id, product_id)上有索引,则它也可用于优化第一个查询。如果您还希望能够优化仅使用product_id的查询,请在该列上创建其他索引。相反,如果您在(product_id, order_id)上有索引,则需要order_id上的单独索引来优化第一个查询。

答案 2 :(得分:0)

为什么你全神贯注于WHERE子句中是否存在列的文字值?就此而言,你为什么一直专注于WHERE条款呢?您的第二个查询可以在没有WHERE子句的情况下重写,并且仍会给出相同的结果:

SELECT
    O.order_id,
    P.product_name
FROM
    order_detail AS OD
    JOIN order AS O ON OD.order_id = O.order_id
    JOIN product AS P ON P.product_id = OD.product_id

引擎是否正在查找查询中指定的文字值,或者是否正在查找连接表中某行的值,这一点并不特别重要。它将尝试选择一种策略,使加入表的过程更有效。

相关问题