2014-06-09 61 views
0

我有一个表格说产品
其具有以下columms:
ID
AdminID
类别ID
此表上的某些查询将是仅在AdminIDQ1)和一些仅在类别IDQ2)。然而,两者上的询问很少,即AdminIDCategoryIDQ3)。
看来,在这种情况下,我需要创建2个指数(不包括ID的那个):两个AdminID类别ID
SQL在一个表上创建多列索引和单列索引

  • 指数与指数AdminID的位置为1。这应该处理Q1Q3
  • 仅限索引类别ID。这应该处理Q2

高于一个好的设计?

+0

您想要查看的行数以及每个AdminID约有多少个独特类别? – scragar

回答

1

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

较长的答案是肯定的,有一些考虑因素;

表中的数据量为索引提供了保证,这意味着维护更新中的数据,插入和删除多个索引时的开销,而不是仅从每个查询的表中提取所有数据。
基本上 - 例如,如果表中不包含“大量数据”,那么避免将索引全部放在一起可能会更好。
也是如何分配?如果数据的80%(例如数字)在字段/列中具有相同的值,则索引对选择可能不太有用,因为查询优化器无论如何仍将基本上接触大多数行,因此开销在维持指数方面可能要大于选择指数的收益。

也不知道你的数据库设计(相关表)的其余部分,不可能说你的结构是否是“最优”的,并且你是否真的需要这个表中的值,或者他们应该在另一个表中,或者你的查询可能会改变。

1

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

在另一方面,任何表具有索引将对插入,更新的性能损失和删除表操作由于指数的同步的成本(索引结构需要被保持排序)。

AdminIDCategoryID外键,其建议在他们每个人的指数,该指数将防止Products表时删除或更新发生在CategoryAdmin(user)表也将帮助查询性能被锁定。

AdminID + CategoryID上有一个复合索引将是事务性能和查询性能之间的折衷。这需要通过分析数据库来找到很好的理由。
MySQL能够登录时间超过指定的时间阈值来执行查询,调用它slow query log及其long_query_time时间参数默认为10秒。
提名慢查询后,您需要通过分析查询的查询执行计划(QEP)来查看原因,然后确定索引创建或删除。

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

1

你是正确的。你只需要创建两个索引:(AdminID,CategoryID)和(CategoryId),因为AdminID包含CategoryID,当优化器认为它符合成本效益时,将使用AdminID。没有理由创建单独的AdminID索引。