如何确定桌面上是否有太多索引?

时间:2010-02-17 03:40:28

标签: php mysql database-design

如何判断我的MySQL表上是否有太多索引?

对于需要访问很多的一些表,我已经在将要访问的列上添加了大约2-4个索引。但我如何才能发现他们弊大于利呢?

5 个答案:

答案 0 :(得分:2)

请注意,在使用索引更新表时,只会出现性能命中,因为必须在表中的数据发生更改时维护所述索引。如果您只是从表中进行选择,则索引通常只能提高性能并且不会降低性能。显然,你需要清除你的表中任何未使用的索引,因为它们会不必要地浪费磁盘空间,并且随着表的不断变化,必须再次维护。

通常,您需要检查执行计划,以根据查询查看实际使用的索引。确保在执行此操作之前收集统计信息以获得准确的结果对执行计划进行此检查非常重要,即使您在列上有索引,优化程序也可能不会根据列的基数等因素选择它。在查询具有高选择性的大型表上(即你有1M用户,而你的查询是userid ='x',它将返回1行),你会发现select的索引值得维护成本。小表,比如一个大陆名称表,通常不会从索引中获益太多,因为全表扫描比索引扫描更多次。这是因为读取索引会花费更多,然后读取索引引用的数据块而不是直接读取少量数据。同样,这些事情需要根据您的具体表格和需求进行验证,而这一切都是通过查看执行计划来完成的。

如果您的查询适合这些类型的查询,则优先使用单列索引的连锁索引。例如,如果where子句通常执行类似“where emp_fname ='jim'和emp_lname ='smith'的操作,请在fname和lname上创建一个连接索引,而不是在每列上创建单独的索引。

答案 1 :(得分:1)

如果插入和更新很慢是一种说法。

答案 2 :(得分:1)

这个问题有很多要素:

  1. 您的索引是否正在使用?
  2. 您的索引是否可以提高效果
  3. 回答这些问题取决于您对查询的控制。假设您有一个Web应用程序,您可能对进入的查询非常了解。如果没有,请启用查询日志一段时间以查看发生了什么。

    接下来,对每个查询运行一个EXPLAIN,并记下正在使用哪些索引来满足它们。如果有任何未使用的,那么你应该删除它们以节省空间和INSERT惩罚。

    接下来,您需要查看索引是否有帮助。基准测试是最准确的方法,但您可能希望在数据库的副本上执行此操作,而不是在实时生产副本上执行此操作。

答案 3 :(得分:0)

索引太多的危险在于它们可能会降低插入/更新/删除速度,因为需要重新计算索引。插入/更新/删除的基准性能。如果您的索引没有出现明显的可测量性能下降,请不要管它们。

答案 4 :(得分:0)

有两种技巧。

  1. 获取最常见查询的查询执行计划。检查正在使用的索引。所有其他索引 - 未显示在查询执行计划中 - 未被使用。

  2. 衡量所选查询的效果。删除索引。再次测量性能,看它是否变坏。

  3. 您必须考虑插入和更新活动以及选择活动。索引选择快,但插入慢。

    不要简单地研究或衡量一项交易。它是决定索引价值的整体交易组合。

    在某些情况下,您可以考虑删除一些索引来执行插入,然后重建它们。