什么mysql表结构更好

时间:2010-05-16 19:55:42

标签: mysql search database-design architecture

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

  1. word VARCHAR,results TEXT或BLOB我将存储已找到对象的ID(例如每个ID有6个字符)

  2. word VARCHAR,result INT,但现在单词不是唯一的

  3. 我想我将在1)中拥有大约20万行,每行1000-10000个ID 或2)中的2亿多行

    第一种方式需要更多的存储空间,但我认为在20000万个非唯一行中的200 000行中找到1个唯一行会快得多

    我考虑word列上的索引而没有sphinx。

    那么你认为呢?

    P.S。一如既往,如果不是很好的话,对不起我的英语。

2 个答案:

答案 0 :(得分:0)

MyISAM似乎是我看到大多数人使用的默认表格,而且我个人从来没有遇到MyISAM效果不佳的情况。如果你想要不同的东西,This sitethis site都会列出MySQL中可用的每种表类型的好处。

答案 1 :(得分:0)

选项1可能表现更好。

在选项1中,您几乎可以完全(如果不是全部)顺序读取所有数据。

在选项2中,可能无法按顺序存储行。但是,如果您同时编写所有内容,那么它们实际上可能在磁盘上具有良好的数据位置。因此,如果不测试您的确切用例,很难确定。

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

如果单词column是主键并且您使用的是最新版本的MySQL,那么使用InnoDB甚至可以获得比MyISAM更好的读取性能。使用InnoDB,所有数据都使用主索引进行聚类,因此您可以使用顺序读取来检索所有数据。但是,你有一个blob的事实可能意味着一个或多个随机读取。当然,经常读取的数据留在InnoDB缓冲池中不会导致磁盘读取。

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