如何确定我的MySQL表上的索引是否过多?
对于一些需要大量访问的表,我已经在将被大量访问的列上添加了大约2-4个索引。但是我怎么才能知道他们是否弊大于利呢?
发布于 2010-02-17 12:07:21
请注意,只有在使用索引更新表时才会对性能产生影响,因为当表中的数据发生变化时,必须维护索引。如果仅从表中进行选择,则索引通常只能提高性能,而不会降低性能。显然,您需要去掉表中任何不使用的索引,因为它们不必要地浪费了磁盘空间,并且随着表随着时间的推移而发生变化,必须再次进行维护。
通常,您需要检查执行计划,以查看根据查询实际使用了哪些索引。在执行此操作之前,请确保收集统计数据以获得准确的结果。检查执行计划是很重要的,b/c即使你有一个列上的索引,优化器可能不会基于诸如列的基数等因素来选择它。在查询具有高度选择性的大型表上(例如,你有1M个用户,并且你的查询是where userid = 'x‘,这将返回1行),你会发现select的索引值得维护成本。小表通常不会从索引中获得太多好处,因为多次全表扫描比索引扫描更可取。这是因为,与直接读取少量数据相比,读取索引然后读取索引引用的数据块的成本会更高。同样,这些事情需要根据您特定的表和需求进行验证,所有这些都是通过查看执行计划来完成的。
如果您的查询适合这些类型的查询,则优先使用连接索引而不是单列索引。例如,如果where子句通常执行类似"where fname = 'jim‘and emp_lname = 'smith’的操作,则在fname和lname上创建一个连接索引,而不是在每个列上创建单独的索引。
发布于 2010-02-17 11:43:49
如果插入和更新很慢,可以通过一种方式来判断。
发布于 2010-02-17 11:48:14
这个问题有很多要素:
的性能
回答这些问题取决于您对查询的控制。假设您有一个web应用程序,那么您可能对即将到来的查询有一个很好的了解。如果没有,请启用查询日志一段时间以查看发生了什么。
接下来,对每个查询运行一次解释,并记下使用了哪些索引来满足它们。如果有任何未使用的,那么您可能应该删除它们,以节省空间并插入惩罚。
接下来,您需要查看索引是否有帮助。基准测试是最准确的方法,但您可能希望在数据库的副本上执行此操作,而不是在实时生产副本上执行此操作。
https://stackoverflow.com/questions/2278159
复制相似问题