Mysql 正在尝试找出此SQL查询的最佳索引

Mysql 正在尝试找出此SQL查询的最佳索引,mysql,sql,indexing,Mysql,Sql,Indexing,我有一个包含300000行测试数据的表,我正试图为这个select语句提供一个合适的索引,但是我相信没有什么能非常有效地工作,我可能需要调整我的方法 x和y可以是1到9之间的任意值,p可以是x*y以上的任意值(因此x/4和y或4等于16,但它可以是高于该值的任何值,没有限制。x/1和y/1的p可能是1000,也可能只是1。另一个x/9和y/9的p可能是81,可能是100,可能是10000,没有限制。) 。。。这对于x和y的特定值非常有效,但是当要求一个范围时,这显然需要更多的工作 有人能找到一种

我有一个包含300000行测试数据的表,我正试图为这个select语句提供一个合适的索引,但是我相信没有什么能非常有效地工作,我可能需要调整我的方法

x和y可以是1到9之间的任意值,p可以是x*y以上的任意值(因此x/4和y或4等于16,但它可以是高于该值的任何值,没有限制。x/1和y/1的p可能是1000,也可能只是1。另一个x/9和y/9的p可能是81,可能是100,可能是10000,没有限制。)

。。。这对于x和y的特定值非常有效,但是当要求一个范围时,这显然需要更多的工作

有人能找到一种有效的方法吗?

对于此查询:

SELECT `x`, `y`
FROM `table`
WHERE `x` <= '9' AND `y` <= '9' AND `used` = '0'
ORDER BY `p` DESC
LIMIT 1;
选择'x','y`
从`表`

其中,`x`有3个可能的索引。但优化器不太可能始终如一地选择最好的。所有这些都从筛选一个有用的东西开始
used=0

INDEX(used, price)  -- This scans from top price down; it wins if
                    -- a good x&y are found soon
INDEX(used, x)  -- This wins if there are few rows with x<9
INDEX(used, y)  -- This wins if there are few rows with y<9
也就是说,如果你真的有
从…
中选择x、y、z,那么这些就不再是“覆盖”,而且(因为体积更大)更糟糕

添加3个索引,希望优化器猜对了


注意:
是否使用了
真/假标志?不要对标志使用
INT
;它需要4个字节。使用
TINYINT
ENUM
,它们只占用1个字节。

如果不使用价格,为什么索引中有价格?对不起,p是价格,我的错误。索引是x,y,used,pTry,x和y上的一个独立索引你所说的“要求一个范围”到底是什么意思?您是否要求用户输入范围?我的PHP代码将选择x的值,我认为这取决于列基数。如果
used
列(1和0)只有两个值,我不会把它放在索引中,至少不会放在第一个索引中place@MaxU . . . 在这种情况下,
=
符号决定了将其放在第一位的选择。我知道,但制作FTS或更好地使用其他索引可能更有效,
SELECT `x`, `y`
FROM `table`
WHERE `x` <= '9' AND `y` <= '9' AND `used` = '0'
ORDER BY `p` DESC
LIMIT 1;
INDEX(used, price)  -- This scans from top price down; it wins if
                    -- a good x&y are found soon
INDEX(used, x)  -- This wins if there are few rows with x<9
INDEX(used, y)  -- This wins if there are few rows with y<9
INDEX(used, price, x, y)
INDEX(used, x, y, price)
INDEX(used, y, price, x)