SELECT Distinct的速度与阵列唯一

时间:2013-04-26 17:21:11

标签: php mysql wordpress

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

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

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

 ID    postID    city      state
auto    int     varchar   varchar

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

我的逻辑也迫使我为每个帖子添加/更新城市和州,即使这会导致重复(在城市/州字段中)。这一定是因为我必须跟踪哪些州/城市存在(实际上有一个与之相关的帖子)。当添加或删除帖子时,它会将其记录带到城市表中或从中获取。

这让我想到了我的问题。

  1. 这个逻辑是否有意义,还是我对DB设计感到厌烦?
  2. 如果它确实有意义,我真正的问题是:**使用MySQL的“SELECT DISTINCT”或只是“SELECT *”然后在结果上使用PHP的array_unique会更快吗?**
  3. 到目前为止对评论/答案进行编辑:
    表的结构正是我在上面输入的方式。 ID上有索引,但此表的要点不是检索索引列表,而是检索所有可用城市/州组合列表的所有结果(这是唯一的)。

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

2 个答案:

答案 0 :(得分:2)

要回答关于使用SELECT distinct与array_unique的问题,我会说我几乎总是喜欢限制数据库中的结果集,当然假设你在你想要的字段上有一个合适的索引获得不同的价值观这样可以节省您将时间从数据库传输到应用程序以及将数据读入内存的应用程序的时间。

就你的单独表格设计而言,很难推测这是否是一种好的方法,这在很大程度上取决于你实际上如何预先形成你的查询(即你是做两个单独的查询 - 一个用于发布信息和一个城市/州信息或查询加入?)。

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

答案 1 :(得分:0)

1)完全规范化的表(当它只有整数值而其他表只有一个int + varchar时)在你不经常进行全表连接和在标准化字段上进行大量搜索时具有优势。作为缺点,它需要大型连接/排序缓冲区并导致更复杂的查询=更少的机会查询将由mysql自动优化。因此,您自己优化了查询。

2)几乎在任何情况下,选择distinct都会更快。只有它会慢一点的情况 - 你在/etc/my.conf中有一个低大小的排序缓冲区和更多大小的内存缓冲区用于php。

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