通过减少索引大小提高MySQL性能?

通过减少索引大小提高MySQL性能?,mysql,indexing,Mysql,Indexing,我有一张大约1.2米的桌子。它有6列索引,包括一个包含URL的varchar(255)字段 我需要能够扫描表,以查看表中是否存在url,从而查看索引,但我想知道,如果将索引大小减少到50左右,是否会看到性能提高 当然,这意味着在数据库中搜索url时可能需要扫描更多行。。但是我只需要大约每30秒做一次查询,所以我想知道更小的索引大小是否值得。想法?索引大小只与磁盘空间有关,因此您不会遇到严重问题 是否有索引可能取决于您的CRUD操作,您是否有更多的选择或更多的插入/更新/删除?如果将索引更改为仅使

我有一张大约1.2米的桌子。它有6列索引,包括一个包含URL的varchar(255)字段

我需要能够扫描表,以查看表中是否存在url,从而查看索引,但我想知道,如果将索引大小减少到50左右,是否会看到性能提高


当然,这意味着在数据库中搜索url时可能需要扫描更多行。。但是我只需要大约每30秒做一次查询,所以我想知道更小的索引大小是否值得。想法?

索引大小只与磁盘空间有关,因此您不会遇到严重问题


是否有索引可能取决于您的CRUD操作,您是否有更多的选择或更多的插入/更新/删除?

如果将索引更改为仅使用前50个字符,我怀疑您是否会看到任何差异

由于它是一个
VARCHAR
列,索引值无论如何只与每个URL一样长,因此查看典型URL,您可能已经为每个URL编制了大约50个字符的索引


即使URL都明显较长,减小索引大小可能只会增加索引部分已存在于内存中的可能性,但我再次怀疑您是否会注意到任何差异。这可能只在流量非常大且您需要开始微优化以提高性能时才有用。

降低流量可能更好的两个原因(假设您的指数有用)

1) 索引也会加载到内存中,因此索引大小增长到无法在内存中完全缓存的程度的可能性很小。这时,您将看到性能下降(所有新的硬件规格……对于120万行来说,这几乎不可能,但仍然值得注意)

2) 很多时候,只有前n个字符足够好,可以快速识别每条记录。您可能根本不需要索引整个255个字符

你可能不在乎的两个原因-

1) 如上所述,您可能永远不会看到索引超出密钥缓冲区,所以为什么要担心呢

2) 您将需要确定前“n”个字符,即使在这之后,性能也将小于或等于完整索引。。。再也不会了。你真的需要花时间吗?它值得失去准确性吗

从我的:

提示:始终以索引原始数据为目标。 这通常是最有用的 可以放入索引中的信息

这是我建议的一般规则,直到有很强的理由去做一些不同的事情

在大多数情况下,空间不是问题所在

就性能而言,索引树深度随索引叶节点的数量呈对数增长。这意味着,将索引大小减少一半可能根本不会减少树的深度。因此,性能增益可能仅限于改进的缓存命中率。但是您提到每30秒执行一次查询。在中等负载的机器上,这意味着您的索引根本不会被缓存(除了,可能每30秒搜索一次相同的URL)

毕竟:我看不出有任何理由违背上面提到的一般建议


如果确实要节省索引空间,请首先尝试查找冗余索引(例如,以相同列开头的索引)。这些通常是低挂果实。

保留一个固定长度为32的url的md5哈希。

我将首先使用mysql“explain”确定查询对每个索引的实际使用,然后开始检查更改。如果在搜索中使用varchar(255)索引,则很难找到更快的内容(索引应提供几乎直接的访问),这就是为什么我会在更改索引字段之前进行调查。所有答案都被否决或为零?引用的提示很好。然而,您的性能分析只关注索引查找,而忽略了索引扫描-索引查找实际上遵循日志(大小)-日志基数相当大,但索引扫描的性能直接遵循大小。因此,这取决于系统主要做什么;例如,它是检索单个记录还是检索排序范围。此外,检索已排序范围的操作可能会较慢,因此速度的感觉会更明显。@Unreason-是。不幸的是,我们两人都在猜测,因为实际的查询没有显示出来。据我从问题中了解,使用该索引每30秒只有一个查询。如果该查询检索到许多记录,那么leave节点遍历和表访问将导致一个错误,因此不使用该语句的索引也可能成为一个选项。不过,这可能比平均URL大小要长。