我有一张约1.2米行的表格。它有6列索引,包括一个包含URL的varchar(255)字段。
我需要能够扫描表以查看表中是否存在url,因此索引,但我想知道我是否会通过将索引大小减小到50左右来看到性能提升?
当然这意味着在搜索数据库中的url时可能需要扫描更多的行..但是我只需要每30秒执行一次这样的查询,所以我想知道索引大小是否较小值得的。想法?
答案 0 :(得分:3)
降低可能更好的两个原因 - (假设你的指数很有用)
1)索引也会被加载到内存中,因此您的索引大小可能会增长到内存中无法完全缓存的程度。多数民众赞成在您看到性能受到打击时(所有新的硬件规格...... 1.2M行几乎不可能,但仍然值得注意)。
2)很多时候,只有第一个'n'字符足够好,能够快速识别每条记录。您可能根本不需要索引整个255个字符。
你可能不关心的两个原因 -
1)如上所述,您可能永远不会看到您的索引增长到关键缓冲区之外,所以为什么要担心。
2)你需要确定第一个'n'个字符,甚至在那之后,性能将小于或等于一个完整的索引......永远不会更多。你真的需要花时间吗?是否值得丢失准确性?
答案 1 :(得分:3)
来自我的SQL indexing tutorial (covers MySQL as well):
提示:始终旨在索引原始数据。 这通常是最有用的 您可以将信息放入索引。
这是我建议的一般规则,直到有充分理由做出不同的事情。
在大多数情况下,空间不是问题。
性能方面,索引树深度与索引叶节点的数量呈对数增长。这意味着,将索引大小减半可能根本不会减少树的深度。因此,性能增益可能仅限于提高的缓存命中率。但是你提到你每30秒执行一次查询。在中等负载的计算机上,这意味着您根本不会缓存索引(除非您每30秒搜索一次相同的URL)。
毕竟:我认为没有任何理由反对上述一般性建议。
如果您确实想要保存索引空间,请首先尝试查找冗余索引(例如,以相同列开头的索引)。这些通常是低调的成果。
答案 2 :(得分:1)
保持您的网址的md5哈希值固定为32长度。
答案 3 :(得分:0)
我怀疑你会通过将索引更改为仅使用前50个字符来看到任何差异。
由于它是VARCHAR
列,因此索引值只会与每个网址一样长,所以查看典型的网址,您可能只会为每个网址编制大约50个字符。
即使URL都显着更长,减少索引大小可能只会增加索引的那部分已经在内存中的机会,但我再次怀疑你会注意到任何差异。这可能仅在体积非常大时才有用,并且您需要开始微观优化以获得更高的性能。
答案 4 :(得分:-1)
索引大小仅对磁盘空间有影响,因此您不会遇到严重问题。
拥有或没有索引可以基于您的CRUD操作,您是否有更多选择或更多插入/更新/删除?