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对表进行排序,那么我不需要通过另一种方式来询问订单,但我不知道如何做到这一点......任何帮助都会很棒.
您应该按顺序尝试索引(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顺序的顺序输出行(可能不是这样的简单情况,但一般情况下).