我目前正在考虑一项服务的实现,需要存储大量可变的用户数据。也就是说:在一个查询中,用户可能会搜索a,b,c,在下一次搜索中越过q,x,a,然后有人会提供引入z和y的其他数据,然后再次将其用于某些查找。
如果我将它作为标准SQL表实现,我有像a,b,c,...,z这样的列,其中大多数列都是null,并且每隔几周会有人为新的列添加另一列特例。
我对这个问题的解决方案是不是通过列描述那些对象,而是作为XML对象来描述,然后只包含与给定对象相关的那些数据:
<myObject>
<a>ValueA</a>
<d>ValueD</d>
...
<q>ValueQ</q>
</myObject>
虽然这从数据角度解决了这个问题,减少了混乱并使数据更具可读性,但我想知道MySQL的性能与列的使用情况相比如何。
我找不到任何有关允许我搜索所有对象的XML索引的信息,其中i.E. <a>value</a>
。由于查找性能对于此服务非常重要,因此我需要了解实现数据值的性能程度与我必须面对的XML有关。可悲的是,我也找不到任何可靠的性能分析。
在MySQL中使用列与将数据保存为XML有什么性能差异?
答案 0 :(得分:0)
数据不会自动编入索引,如果您在ExtractValue
查询结果,则比较在内存中完成,并且不使用索引。您需要手动将这些列定义为“STORED”列,这仅适用于5.7 +。
ALTER TABLE foo ADD COLUMN some_node_of_my_xml TEXT AS (ExtractValue(doc, "/some/path/to/my/node/@name")) STORED;
然后,您可以查询some_node_of_my_xml
,就像您在任何其他列上所做的那样。
但实质上它与提取数据并将其存储在应用程序级别而不是数据库级别完全相同。
我建议的是将这些“动态”字段存储在单独的表,名称/值对和JOIN中。 或者实现ElasticSearch,或者切换到像Mongo这样的“传统”文档数据库。