1

我正在使用带有一些自定义帖子类型的 WordPress(只是为了描述我的数据库结构 - 它的 WP)。

每个帖子都有自定义元,它存储在一个单独的表(postmeta 表)中。就我而言,我正在存储城市和州。

我在 WP 的 save_post/trash_post 挂钩中添加了一些操作,以便城市和州也存储在单独的表(城市)中,如下所示:

 ID    postID    city      state
auto    int     varchar   varchar

我这样做是因为我认为这个表比查询相当大的 postmeta 表来获取可用城市和州的列表要快。

我的逻辑还迫使我为每个帖子添加/更新城市和州,即使这会导致重复(在城市/州字段中)。必须如此,因为我必须跟踪存在哪些州/城市(实际上有一个与之相关的帖子)。添加或删除帖子时,它会将其记录与它一起传入或传出城市表。

这让我想到了我的问题。

  1. 这个逻辑有意义还是我不擅长数据库设计?
  2. 如果它确实有意义,我真正的问题是:**使用 MySQL 的“SELECT DISTINCT”还是只使用“SELECT *”然后在结果上使用 PHP 的 array_unique 会更快吗?**

迄今为止对评论/答案的编辑:
表格的结构正是我在上面输入的方式。ID 上有一个索引,但该表的目的不是检索索引列表,而是检索所有可用城市/州组合列表的所有结果(唯一)。

我想我可能会选择(我不知道为什么我以前没有想到这一点)只是在 wp_options 表的 ONE 记录中添加一个城市/州组合的序列化列表。然后我可以获取该记录,并过滤掉我需要的唯一记录。我能得到一些反馈吗?我想检索和过滤序列化数组会比将数据存储在单独的表中进行检索更快。

4

2 回答 2

2

要回答有关使用 SELECT distinct 与 array_unique 的问题,我会说我几乎总是更喜欢限制数据库中的结果集,当然假设您在尝试获取不同值的字段上有适当的索引. 这可以节省您将额外数据从数据库传输到应用程序以及应用程序将该数据读取到您可以使用它的内存中的时间。

就您的单独表设计而言,很难推测这是否是一种好方法,这在很大程度上取决于您实际执行查询的方式(即您是否在执行两个单独的查询 - 一个用于发布信息,一个用于城市/州信息或跨连接查询?)。

这实际上只是确定什么是最快方法的唯一确定方法。那就是在您的环境中测试两种方式。

于 2013-04-26T17:28:01.410 回答
0

1)完全规范化的表(当它只有整数值而其他表只有一个 int+varchar 时)在您不经常进行全表连接并且对规范化字段进行大量搜索时具有优势。不利的一面是,它需要大的连接/排序缓冲区并导致更复杂的查询=mysql自动优化查询的机会要少得多。因此,您可以自己优化查询。

2)几乎在任何情况下,选择不同的都会更快。只有在它会变慢的情况下 - 您在 /etc/my.conf 中的排序缓冲区大小较小,而 php 的内存缓冲区大小要大得多。

不同的选择可以使用索引,而您的代码不能。向您的应用程序发送大量数据也需要大量的 mysql cpu 时间和实时性。

于 2013-04-26T17:43:34.593 回答