我有一个表格说产品。
其具有以下columms:
ID
AdminID
类别ID
此表上的某些查询将是仅在AdminID(Q1)和一些仅在类别ID(Q2)。然而,两者上的询问很少,即AdminID和CategoryID(Q3)。
看来,在这种情况下,我需要创建2个指数(不包括ID的那个):两个AdminID和类别ID
SQL在一个表上创建多列索引和单列索引
- 指数与指数AdminID的位置为1。这应该处理Q1和Q3。
- 仅限索引类别ID。这应该处理Q2。
高于一个好的设计?
我有一个表格说产品。
其具有以下columms:
ID
AdminID
类别ID
此表上的某些查询将是仅在AdminID(Q1)和一些仅在类别ID(Q2)。然而,两者上的询问很少,即AdminID和CategoryID(Q3)。
看来,在这种情况下,我需要创建2个指数(不包括ID的那个):两个AdminID和类别ID
SQL在一个表上创建多列索引和单列索引
高于一个好的设计?
简短的回答是 - 是的,没关系。如果数据的使用保证,在需要时做索引是“好设计”。
较长的答案是肯定的,有一些考虑因素;
表中的数据量为索引提供了保证,这意味着维护更新中的数据,插入和删除多个索引时的开销,而不是仅从每个查询的表中提取所有数据。
基本上 - 例如,如果表中不包含“大量数据”,那么避免将索引全部放在一起可能会更好。
也是如何分配?如果数据的80%(例如数字)在字段/列中具有相同的值,则索引对选择可能不太有用,因为查询优化器无论如何仍将基本上接触大多数行,因此开销在维持指数方面可能要大于选择指数的收益。
也不知道你的数据库设计(相关表)的其余部分,不可能说你的结构是否是“最优”的,并且你是否真的需要这个表中的值,或者他们应该在另一个表中,或者你的查询可能会改变。
一般来说(忽略RDBMS规范),您可以考虑Products
表中的任何索引是包含基于索引列的Products
表的排序数据的另一个表。这将是一个有效的结构,当searching the table based on the index column。
在另一方面,任何表具有索引将对插入,更新的性能损失和删除表操作由于指数的同步的成本(索引结构需要被保持排序)。
AdminID
和CategoryID
外键,其建议在他们每个人的指数,该指数将防止Products
表时删除或更新发生在Category
或Admin(user)
表也将帮助查询性能被锁定。
在AdminID + CategoryID
上有一个复合索引将是事务性能和查询性能之间的折衷。这需要通过分析数据库来找到很好的理由。
MySQL能够登录时间超过指定的时间阈值来执行查询,调用它slow query log及其long_query_time时间参数默认为10秒。
提名慢查询后,您需要通过分析查询的查询执行计划(QEP)来查看原因,然后确定索引创建或删除。
你是正确的。你只需要创建两个索引:(AdminID,CategoryID)和(CategoryId),因为AdminID包含CategoryID,当优化器认为它符合成本效益时,将使用AdminID。没有理由创建单独的AdminID索引。
您想要查看的行数以及每个AdminID约有多少个独特类别? – scragar