我有一个包含很多字段的InnoDB表,其中一个是32字节的唯一散列(典型的md5结果)。
我必须通过该哈希进行大量查询,但我的表开始变大(500.000条记录),这种搜索需要花费大量时间:
SELECT id FROM `table` WHERE `key`='Bj8DzS7RmCG41nLdgOp0kEhNtrfPo3KF'
这花了大约0.7s
我可以创建这个“哈希”32字节varchar列的索引,但是这个表增长很多,如果我必须优化表(重新索引),那么这需要花费很多时间(关于在我的情况下10分钟),锁定所有其他实时查询。
那么,优化查询的最佳方法是什么,你必须通过一个32字节的varchar字段进行搜索?
答案 0 :(得分:0)
你需要一个简单的索引。
另外,你提到varchar但你的列不是可变长度,所以char(32)更合适。
如果您担心在插入新行时维护索引的成本,可以考虑将表分区为较小的块。例如,您可以根据哈希的第一个字符有16个单独的表,例如table_0,table_1 .... table_f - 现在每个表只包含30,000条记录。或者你可以在前两个字符上进行分区,以提供256个表。
虽然您可以手动执行此操作,但请结帐MySQL's built in support for partitioning too。