Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 元表与具有多个字段的表,在大范围内。性能方面_Mysql_Sql_Database Design_Scalability_Entity Attribute Value - Fatal编程技术网

Mysql 元表与具有多个字段的表,在大范围内。性能方面

Mysql 元表与具有多个字段的表,在大范围内。性能方面,mysql,sql,database-design,scalability,entity-attribute-value,Mysql,Sql,Database Design,Scalability,Entity Attribute Value,以下是一个具体的例子: Wordpress将用户信息(meta)存储在一个名为wp_usermeta的表中,从中可以获得meta_键字段(例如:first_name)和meta_值(John) 然而,只有在50个左右的用户之后,该表才打包了大约1219条记录 所以,我的问题是:从性能的角度来看,在一个大规模的表中,将所有元作为一个字段,还是像WordPress这样的表中将所有元作为一行 在这两种情况下都正确设置了索引。几乎不需要添加新的图元。请记住,像wp_usermeta这样的表必须使用文本/

以下是一个具体的例子:

Wordpress将用户信息(meta)存储在一个名为wp_usermeta的表中,从中可以获得meta_键字段(例如:first_name)和meta_值(John)

然而,只有在50个左右的用户之后,该表才打包了大约1219条记录

所以,我的问题是:从性能的角度来看,在一个大规模的表中,将所有元作为一个字段,还是像WordPress这样的表中将所有元作为一行

在这两种情况下都正确设置了索引。几乎不需要添加新的图元。请记住,像wp_usermeta这样的表必须使用文本/长文本字段类型(大占用空间),以便容纳可以输入的任何类型的数据

我的假设是,只有当您不知道用户可能需要什么时,WordPress方法才是好的。否则:

  • 检索所有元需要更多的I/O,因为字段不是存储在一行中。这一领域没有得到优化
  • 你不可能在meta_值字段上有一个真正的索引而不遭受主要的缺点(索引一个长文本?除非它是一个部分索引…但是,那么,多长时间?)
  • 很快,你的数据库就被许多行弄得乱七八糟,诅咒你的研究即使是最精确的元数据
  • 不支持开发人员友好型。您无法真正执行加入请求以获得所需的一切并正确显示

不过,我可能遗漏了一点。我不是一名数据库工程师,我只知道SQL的基本知识。

取决于wp\u usermeta中平均包含的名称数量

众所周知,文本字段搜索速度非常慢。索引通常更快

但是一些数据仓库索引了每个领域的垃圾,Wordpress可能也在做同样的事情

我会把meta作为一个字段而不是一行来投票

晚安,晚安。
Mike

您正在谈论的是实体属性值

- Entity    = User, in your Wordpress Example  
- Attribute = 'First Name', 'Last Name', etc  
- Value     = 'John', 'Smith', etc  
这样的模式非常擅长为任何给定的实体提供动态数量的属性。添加属性不需要更改模式。根据查询的不同,通常可以在不更改任何SQL的情况下使用新属性

如果您知道要查找的实体和属性,那么它在检索这些属性值时也足够快。这只是一个非常奇特的键值对类型的设置

但是,如果您需要根据值内容搜索记录,则情况就不太好了。例如,
让我找到所有名为“John Smith”的用户。
。用英语问很琐碎。针对“正常”表编写代码是很简单的<代码>名字='John'和姓氏='Smith'。但是,针对EAV编写SQL非常繁琐,而且相对性能非常差;(先获取所有的Johns,然后获取所有的Smiths,然后将它们相交以获取两者都匹配的实体。)


有很多关于EAV在线的说法,所以我在这里不会详细介绍。但一般的经验法则是:如果你能避免,你可能应该这样做。

因为我所看到的EAV模型不会影响性能。除非您需要空值。在这种情况下,您应该与包含所有类型的表进行联接

我不同意民主党人的回答

如果你想得到用户的全名,你不需要要求所有与之匹配的名字

为此,您应该使用第五个或第六个NF

或者您甚至可以有一个用户实体表,其中您有:

  • 身份证
  • 用户名
  • 密码

就这样。这是基础,对于所有用户“额外”数据,您应该有一个用户元和用户类型元实体。然后是用户。

GPL竞技场中两个主要软件的示例将说明这两种设计之间的巨大差异:

Wordpress与oScommerce

两者都有各自的缺点和优势,在各自领域都占据着巨大的主导地位,很多事情都是通过它们来完成的。但是它们之间的一个基本的和最大的区别是它们的数据库表设计方法。当然,在比较它们时,它们的代码体系结构也会影响它们的搜索速度,但两者都有各自的缺点,也有各自的优点,因此对于生产环境来说,比较或多或少是准确的

Wordpress使用EAV。一般数据(称为具有不同post类型的post)存储为主实体,其他所有数据存储在post元表中。一些基本数据存储在主表中,如修订版、帖子类型等,但几乎所有其他数据都存储在metas中

非常适合添加、修改数据,从而实现功能

但是,尝试使用复杂的SQL联接进行搜索,该联接需要从元表中提取3-4个不同的值并获得结果集。它是一只铁狗。根据您正在搜索的数据,搜索速度非常慢

这就是为什么你看不到很多需要承载复杂数据的wordpress插件的原因之一,而实际上需要承载复杂数据的插件往往会创建自己的表

另一方面,oScommerce在products表中保留几乎所有与产品相关的数据。大多数oScommerce MOD都会修改此表并添加其字段。有产品属性表,但这也是相当平坦的,没有任何元设计。它只是通过产品ID链接到产品

因此,尽管oScommerce是很久以前的一个古老的意大利面代码,但即使在您搜索复杂的组合产品标准时,它也能提供惊人的快速搜索结果。实际上,oScommerce的大多数正常显示代码(如产品详细信息页面中显示的代码)都来自于相当复杂的SQL,它们在复杂的join语句中从大约2-3个表中提取数据。相比之下,更简单的sql甚至只需要一个连接就可以让wordpress和数据库结合起来