2010-05-16 204 views
2

我在我的网站上有非常复杂的搜索算法,所以我决定用 缓存表或所有可能的结果。 我想问一下哪种结构会更好,或者不是其中之一? (MySQL的)什么mysql表结构更好

  1. word VARCHAR,results TEXT或BLOB我将在其中存储中找到的对象的标识(例如6个字节用于每个ID)

  2. word VARCHAR,result INT,但话不独特现在

我想我要在1 1000-10000 IDS每一行 或200 000 000多个行2)

约200 000行)

第一种方式需要更多的存储内存,但我认为这将是更快找到1个唯一行之间的200万辆,比1000行之间的200个亿非唯一行

我想对word列,没有狮身人面像指数。

那你觉得呢?

p.s.像往常一样,如果不是很好,我的英语很抱歉。

+0

没有足够的信息给我,但MySQL确实有原生全文检索(FTS):http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html – 2010-05-16 20:24:43

回答

0

MyISAM似乎是我看到大多数人使用的默认表,并且我从未亲自有过MyISAM工作不正常的情况。 This sitethis site都列出了MySQL中可用的每种表类型的好处,如果你想要不同的东西。

0

选项1可能会表现更好。

在选项1中,您将能够几乎完全读取所有数据(如果不是全部的话)顺序读取。

在选项2中,行可能不会按顺序存储。但是,如果您将它们全部写入,那么它们实际上可能在磁盘上具有良好的数据位置。所以,如果没有测试你的确切用例,很难确定。

如果您正在对缓存表进行增量更新,最佳策略会受到影响。在选项1中,更新将花费更长时间,因为可能需要将blob写入新页面。在选项2中,您只需添加新行,但您也可能需要删除行。如果您使用增量更新添加新行,您最终可能会得到更多的随机读取,这会使缓存表读取速度变慢。

如果单词列是主键并且您使用的是最新版本的MySQL,那么使用InnoDB读取性能甚至可能比MyISAM更好。借助InnoDB,所有数据都与主索引集成,因此您可以通过顺序读取来检索所有数据。虽然可能意味着一个或多个随机读取,但您有一个blob的事实。当然,经常读取的数据足以保留在InnoDB缓冲池中,不会产生磁盘读取。

使用MyISAM,MySQL需要读取索引表(尽管它可能缓存在keybuffer中)以获取指向数据表(可能会缓存在OS磁盘缓冲区中)的指针。