我在MySQL表中有两列,一个是startDay varchar(10),比如"2020-03-23",另一个是orderId archer(20),它们都可以为空
如果我在(orderId,startDay)上创建联合索引
select * from table where orderId is null and startDay < '2020-03-23'
select * from table where orderId is not null and startDay < '2020-03-23'对于上面两个sql语句,我有两个问题: 1)第一个语句是否使用了联合索引中的两个列?由于有数千万行,如果语句没有同时使用两个索引,而只使用了索引的一部分(即第一个),那么性能可能会很低?
2)第二个不能使用联合索引?为什么?
发布于 2020-03-18 01:49:02
第一个可以充分利用索引,因为它只有一个基于范围的条件,也就是索引中的后一个字段。
基本上,它是这样的:
orderId IS NULL在索引中查找标识所有IS NULL条目的特定节点,startDay < '2020-03-23'很容易标识。对于第二个查询,orderId IS NOT NULL基本上标识了除标识IS NULL orderId值的节点之外的每个第一层节点。而且MySQL不会在索引方面更进一步。(它在第一个ranged条件下停止)。
而且,第一个查询具有与=条件等效的列,第二个查询具有<>条件,这与拥有一个可空的列并不重要。
https://stackoverflow.com/questions/60727541
复制相似问题