2014-02-13 192 views
1

我有一个具有100K行的单个表DB。大约有30列,其中28个是varchars/tiny文本,其中一个是int主键,其中一个是blob。MySQL数据库规范化

我的问题,就性能而言,将blob与表的其余部分分开并将它们存储在自己的表中并将外键约束保存到主ID,会更好吗?

该表最终将变成一个用于iOS核心数据的sqlite持久性存储,并且将根据轻量级varchar列的NSPredicate完成大量搜索/筛选。

对不起,如果这太主观,但我想有一个推荐的方法。

谢谢!

+1

数据库规范化与数据类型无关。如果每行只有一个blob项目,它所在的表格可能是最适合的。 –

+0

如果你有大量的blob数据,它最有可能是将它存储在文件中的最好方式,并且在数据库内部有路径。 –

+0

这是为什么用mysql标记的? – Holly

回答

1

这完全取决于数据的使用情况。

如果您每次查询表时都需要数据,那么在单独的表中就没有区别(只要blob数据在每一行中都是唯一的 - 即“只要数据库被标准化” )。

如果你不需要blob数据,但只需要来自其他列的元数据,那么可能会有速度奖金qhen查询blob是否有自己的表。查询blob数据的速度较慢,因为您需要查询bowth表。

USUAL方式不是将任何blob数据存储在数据库中(至少不是大数据),而是将二进制数据存储到文件中,而是在数据库内部具有域路径。这是推荐的,因为二进制数据很可能不会受益于DBMS内部(不可索引,可排序,可分组等),所以不存在将其存储在文件内的缺点,而数据库未针对二进制进行优化数据(因为,无论如何,它不能做太多)。

+0

我不同意这种“通常”的方式。虽然它适用于本地应用程序,但在开发基于服务器的系统时,必须处理与数据库一起维护文件系统的单独安全性和访问权限通常会使该选项的吸引力降低。 –

+0

@GordonLinoff这真的取决于。基于Web的应用程序,只有你和可能的一些受信任的开发人员才能访问服务器,设置适当的访问权限不应该太过分。 –

+0

雅,blob数据不是二进制的,它的文本blob。最可能的矫枉过正,但是当我捕获数据时,我不知道会发生什么。能够被搜索并且最终可能想考虑使用solr来索引它是很好的,但现在,它的每个blob大约有5kb的文本。将它存储在单个文件中对我来说太多了,因为我不希望iOS上的文件开销或管理问题。 – 4m1r

0

Blob存储在磁盘上只存储在Mysql中的内存中。使用外键将它移动到另一个表格不会显着帮助您的表现。不知道这是否是sqlite的情况。

2

如果你做SELECT * FROM table(如果你实际上不需要BLOB字段,你不应该这样做),那么是的,查询将会更快,因为在这种情况下,带有BLOB的页面将不会被触及。

如果您经常使用SELECT f1, f2, f3 FROM table(所有字段都是非BLOB),那么是的,将BLOBS存储在一个单独的表中将会使查询更快,原因相同 - MySQL将不得不读取较少的页面。

但是,如果经常选择BLOB,那么单独保留BLOB是没有意义的。

+0

有趣,谢谢。只有在用户从Master - > Detail视图请求blob数据时才需要blob。所以很少。 – 4m1r

+0

然后你应该实际分割它。 –

+0

另外一个我忘记提及的时刻。 如果一条记录小于7kB,那么BLOB将被存储在索引页中。如果时间更长 - 索引页中只存储了前768个字节(如果梭子鱼格式为20个),则剩下的部分进入外部页面。 因此,如果您的BLOB长度超过7kB,那么分割表格也许没有意义。梭子鱼 - 当然。使用羚羊 - 取决于768个字节与记录中的其他字段进行比较的大小。 – akuzminsky