我有一张表说产品。
它有以下columms:
的 ID
的 AdminID
的类别ID
此表格中的某些查询仅在 AdminID ( Q1 )上,有些仅在 CategoryID ( Q2 )上。但是,对两者的查询都很少,即 AdminID 和 CategoryID ( Q3 )。
看来在这种情况下我需要创建2个索引(不包括id上的索引):
高于一个好的设计?
答案 0 :(得分:1)
简短回答是 - 是的,没关系。如果数据的使用需要,那么在需要时制作索引是“好的设计”。
更长的答案是肯定的,只需考虑一些因素;
表中的数据量保证了索引,这意味着在多个索引中维护数据的更新,插入和删除的开销,而不是从每个查询的表中提取所有数据。
基本上 - 例如,如果表格中不包含“大量数据”,那么最好只避免将索引放在一起。
分布情况如何?如果80%(仅作为示例的数字)数据在字段/列中具有相同的值,则索引在选择上可能不太有用,因为查询优化器仍然必须基本上触摸大多数行,因此开销保持索引的可能性大于选择它时的增益。
在不了解数据库设计的其余部分(相关表格)的情况下,无法确定您的结构是否“最优”,以及您是否确实需要该表中的值,或者它们应该位于另一个表中,或者您的查询是否可能可以改变。
答案 1 :(得分:1)
一般来说(忽略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),然后决定创建或删除索引来查看原因。
答案 2 :(得分:1)
你是对的。您只需要创建两个索引:(AdminID,CategoryID)和(CategoryId),因为AdminID涵盖CategoryID,当优化程序认为它具有成本效益时,将使用AdminID。没有理由创建单独的AdminID索引。