我有一张桌子products
:
#products
ID | category | type | criteria1 | criteria2
,category
和type
是其他表的外键。
我应该将这张表分成category1_type1_products
,category1_type2_products
等等吗?在我看来我应该这样做,因为现在在我的表中,有几千个具有相同ID
和category
值的条目。大量冗余信息。
此外,如果 mysql 不必首先搜索具有特定类别和类型的所有行,则查询可以执行得更快。(正确的?)
这是推荐的结构化行为吗?如果不是,如果我的表有 500 万个元组怎么办?
不,这意味着表 NAME 包含 DATA - 然后您必须修改数据库结构(创建新表)才能添加一个类别或类型。
如果您的类别/类型列是 tinyint 或 smallint(取决于可能值的合理预期数量),那么您实际上已经进行了适当的规范化。如果两个不同行的类别的两个键之间没有(功能)依赖性,那么这两个值不是冗余,而是存储实际数据的最小方式。
从性能的角度来看,重要的部分是为您的查询建立适当的索引。如果您经常搜索具有特定类别和/或类型的行,您应该在该列上建立索引(或在两列上建立复合索引,可能还有其他索引)以优化此类查询。您应该启用慢速查询日志并定期检查哪些查询花费的时间最多(您可以
pt-query-digest
用来分析日志)并优化它们(添加适当的索引和/或重写查询)。当您有适当的索引时,那么在您提出的多个表的情况下,实际上选择要读取的正确表将花费大约与 MySQL 需要“跳转”到索引的正确部分相同的时间。(这有点过于简单化,但关键是选择正确的表来读取本身就是一种开销)。
从“模式”的角度来看,我会更关心这两列
criteria1
,criteria2
如果这些是它们的真实名称和用法,那么这似乎是一个可能的问题 - 但这可能取决于您的用例并且实际上可能没问题。但是,如果您有机会添加一次criteria3
和其他人,那么这将告诉您为这些添加单独的表,每个条件一行,FK 到当前表。