SQL在表上创建多列索引和单列索引

时间:2014-06-09 14:28:42

标签: mysql sql

我有一张表说产品
它有以下columms:
ID
AdminID
类别ID
此表格中的某些查询仅在 AdminID Q1 )上,有些仅在 CategoryID Q2 )上。但是,对两者的查询都很少,即 AdminID CategoryID Q3 )。 看来在这种情况下我需要创建2个索引(不包括id上的索引):

  • 管理员类别ID 的索引,管理员ID 在索引中的位置为1。这应该处理 Q1 Q3
  • CategoryID 的索引。这应该处理 Q2

高于一个好的设计?

3 个答案:

答案 0 :(得分:1)

简短回答是 - 是的,没关系。如果数据的使用需要,那么在需要时制作索引是“好的设计”。

更长的答案是肯定的,只需考虑一些因素;

表中的数据量保证了索引,这意味着在多个索引中维护数据的更新,插入和删除的开销,而不是从每个查询的表中提取所有数据。 基本上 - 例如,如果表格中不包含“大量数据”,那么最好只避免将索引放在一起。
分布情况如何?如果80%(仅作为示例的数字)数据在字段/列中具有相同的值,则索引在选择上可能不太有用,因为查询优化器仍然必须基本上触摸大多数行,因此开销保持索引的可能性大于选择它时的增益。

在不了解数据库设计的其余部分(相关表格)的情况下,无法确定您的结构是否“最优”,以及您是否确实需要该表中的值,或者它们应该位于另一个表中,或者您的查询是否可能可以改变。

答案 1 :(得分:1)

一般来说(忽略RDBMS规范)您可以认为Products表上的任何索引都是另一个包含基于索引列的Products表的排序数据的表。 searching the table based on the index column时,这将是一个有效的结构。

另一方面,由于索引的同步成本(索引结构需要保持排序),在任何表上使用索引会对表上的插入,更新和删除操作造成性能损失。

AdminIDCategoryID是外键,建议在每个键上都有索引,当Products上发生删除或更新时,索引会阻止Category表被锁定或Admin(user)表也有助于查询性能。

AdminID + CategoryID上使用复合索引将是在事务性能和查询性能之间进行权衡的问题。这需要通过分析数据库进行指导以找到合理的理由 MySql可以记录执行时间超过指定时间阈值的查询,将其称为slow query log,其long_query_time参数默认为10秒。
提名慢查询后,您需要通过分析查询的查询执行计划(QEP),然后决定创建或删除索引来查看原因。

  

Know your data, know your queries, and MENTOR your indexes

答案 2 :(得分:1)

你是对的。您只需要创建两个索引:(AdminID,CategoryID)和(CategoryId),因为AdminID涵盖CategoryID,当优化程序认为它具有成本效益时,将使用AdminID。没有理由创建单独的AdminID索引。