Mysql 可以在最左边的多个索引上按范围选择吗?

Mysql 可以在最左边的多个索引上按范围选择吗?,mysql,indexing,range,myisam,multiple-columns,Mysql,Indexing,Range,Myisam,Multiple Columns,我在k1,k2,k3上有一个索引m_idx 如果我这样做 选择c1、c2、c3。。。根据tb力指数m_idx,其中k1=500,k2 IN。。。而k2>2000的订单由k1限制为1000; 或 选择c1、c2、c3。。。来自tb力指数m_idx,其中k1在50010001500中。。。和k2在。。。而k2>2000的订单由k1限制为1000; 处理程序\u read\u next=999 但如果我尝试在k1上使用范围: 选择c1、c2、c3。。。来自tb力指数m_idx,其中k1>=500,k2

我在k1,k2,k3上有一个索引m_idx 如果我这样做 选择c1、c2、c3。。。根据tb力指数m_idx,其中k1=500,k2 IN。。。而k2>2000的订单由k1限制为1000; 或 选择c1、c2、c3。。。来自tb力指数m_idx,其中k1在50010001500中。。。和k2在。。。而k2>2000的订单由k1限制为1000; 处理程序\u read\u next=999

但如果我尝试在k1上使用范围: 选择c1、c2、c3。。。来自tb力指数m_idx,其中k1>=500,k2 IN。。。而k2>2000的订单由k1限制为1000; 处理器\u读取\u下一个=58035 在所有情况下,解释说使用的密钥是m_idx 但我认为在第三种情况下,m_idx没有使用,我也只有k1上的索引。 否则我不明白为什么它读了1000多行。 我希望扫描m_idx索引,并且只扫描满足条件的前1000行,以便从表中读取。 但事实上,我认为对于第三种情况,它扫描索引,从tb中读取满足k1条件的行,并在从tb中读取行之后检查k2和k3条件。 我使用:MySql和MyISAM,windows764,tb有1百万行; 因此,我的问题是: 可以在最左边的多个索引上按范围选择吗? 或 我又做错什么了? 多谢各位

不,不是。 不,你做的一切都对 7.3.1.3.2。多部件索引部件的范围访问方法

因此,您无法帮助优化器更快地执行此查询

避免使用FORCE索引,因为优化器更了解使用什么索引

此外:


根据哪个部分返回的记录较少,k1>=500或k2 IN。。。k2>2000我不知道为什么这里需要>2000,因为您可以手动比较,在添加到IN之前,如果k2部分返回的记录数量较少,您也可以尝试创建索引k2。

我已经阅读了该章,但我没有发现有人明确表示这是不可能的。此外,它更令人困惑,因为它说:对于一个BTREE索引,一个区间可能适用于与和组合的条件,其中**每个条件**使用=,is NULL,>,=,@silversky比较一个关键部分和一个常量值。是的,可能是,但不是在您的情况下,也不是在所有情况下。这在技术上是可能的,是的,但不适用于此类查询。只要有可能确定一个包含符合条件的所有行的单键元组,就可以使用区间-这是关键短语。再看看这个短语后面的示例-它和你的完全一样。@zerkms如果我说这些文档有时真的很糟糕,我不认为我错了。在本章的第一段中,它说:多部分索引上的范围条件限制索引行位于一个或多个关键元组间隔内。后来它说,就像你指出的:确定一个单一的关键点tuple@zerkms因为,当我在…中使用k1时。。。它起作用了我在跳也许我做错了什么。但你可能是赖特。尽管我看不出有任何理由不实现此选项。@silversky:尝试在B树中实现搜索,该B树由任何编程语言中的2个值组成,手动从头开始。之后-执行类似k1>A和k2>B的搜索;-我同意,mysql开发人员比您和我经验丰富,但这个解决方案可能有点棘手。
k1>=500 AND k2 IN(...) AND k2>2000