我理解需要多列索引,并且索引顺序在请求中很重要,例如
SELECT product_id
FROM order_detail
WHERE order_id in (1, 2, 3)
但是,当WHERE
子句中没有值时,我无法弄清楚多列索引和索引顺序的必要性。
我相信多列索引仅在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
如果在WHERE
子句中的两列上进行搜索时仍然需要多列索引,即使其中没有值,为多列提供的正确顺序是什么索引呢?
关于表order_detail的上述示例,我应该使用(order_id,product_id)还是应该使用(product_id,order_id)?当WHERE
子句中没有值时,订单是否重要?
非常感谢你的帮助。
答案 0 :(得分:1)
列的顺序很重要。 MySQL可以使用索引(product_id, order_id)
进行以下操作:
但不是为了:
值得注意的是MySQL可以选择不使用索引。例如,如果1000个订单中只有10个不同的产品,那么MySQL可以忽略该索引。
我建议首先放置具有更高基数的列。或者更好的是,创建两个索引(product_id, order_id
和order_id, product_id
)并让MySQL决定使用哪个索引。
答案 1 :(得分:0)
优化WHERE
子句时,只能使用一个索引。因此,如果您要测试多个列,并且希望获得最佳性能,则应使用包含所有(或大多数)列的多列索引。如果您创建两个单独的索引,它将只使用其中一个来优化WHERE
条件的那一部分,然后它将必须在这些行中进行扫描以匹配其他条件。
多列索引可用作前缀中任何列集的索引。因此,如果您在(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
引擎是否正在查找查询中指定的文字值,或者是否正在查找连接表中某行的值,这一点并不特别重要。它将尝试选择一种策略,使加入表的过程更有效。