mysql索引的速度

hac*_*ist 1 mysql indexing performance

我有一张桌子,平均约有2至5百万行.它有一个名为'instruction_id'的主键/索引和另一个名为'mode'的索引字段.现在'instruction_id'当然是唯一的,因为它是主键,但'mode'只是3个不同值中的一个.我一直运行的查询是

SELECT * FROM tablename WHERE mode = 'value1' ORDER BY instruction_id LIMIT 50
Run Code Online (Sandbox Code Playgroud)

这目前大约需要25秒(> 1秒是不可接受的长)但是现在只有600K行,所以随着表的增长它会变得更糟.以不同的方式索引会有帮助吗?如果我将instruction_id和mode一起索引会产生影响吗?如果我能以某种方式自然地通过instruction_id对表进行排序,那么我不需要通过另一种方式来询问订单,但我不知道如何做到这一点......任何帮助都会很棒.

Alb*_*nbo 5

您应该按顺序尝试索引(mode,instruction_id).

该索引背后的原因是它创建了一个这样的索引

mode  instruction_id
A     1
A     3
A     4
A     5
A     10
A     11
B     2
B     8
B     12
B     13
B     14
C     6
C     7
C     9
C     15
C     16
C     17
Run Code Online (Sandbox Code Playgroud)

如果搜索模式B,sql server可以在模式下使用二进制搜索搜索索引,直到找到第一个B,然后它就可以简单地输出下一n行.这将非常快,对于4M行大约22比较.

ORDER BY无论数据如何存储,如果您希望订购结果,请始终使用.查询引擎可能会选择一个查询计划,该计划以不同于PK顺序的顺序输出行(可能不是这样的简单情况,但一般情况下).