我的网站上有非常复杂的搜索算法,所以我决定用一张桌子 缓存或可能是所有可能的结果。 我想问一下哪种结构会更好,或者可能不是其中一种? (MySQL的)
word
VARCHAR,results
TEXT或BLOB我将存储已找到对象的ID(例如每个ID有6个字符)
word
VARCHAR,result
INT,但现在单词不是唯一的
我想我将在1)中拥有大约20万行,每行1000-10000个ID 或2)中的2亿多行
第一种方式需要更多的存储空间,但我认为在20000万个非唯一行中的200 000行中找到1个唯一行会快得多
我考虑word
列上的索引而没有sphinx。
那么你认为呢?
P.S。一如既往,如果不是很好的话,对不起我的英语。
答案 0 :(得分:0)
MyISAM似乎是我看到大多数人使用的默认表格,而且我个人从来没有遇到MyISAM效果不佳的情况。如果你想要不同的东西,This site和this site都会列出MySQL中可用的每种表类型的好处。
答案 1 :(得分:0)
选项1可能表现更好。
在选项1中,您几乎可以完全(如果不是全部)顺序读取所有数据。
在选项2中,可能无法按顺序存储行。但是,如果您同时编写所有内容,那么它们实际上可能在磁盘上具有良好的数据位置。因此,如果不测试您的确切用例,很难确定。
如果要对缓存表执行增量更新,则会影响最佳策略。在选项1中,更新将花费更长时间,因为可能需要将blob写入新页面。在选项2中,您只需添加新行,但您也可能还需要删除行。如果在增量更新中添加新行,最终可能会导致更多随机读取,这会使缓存表读取速度变慢。
如果单词column是主键并且您使用的是最新版本的MySQL,那么使用InnoDB甚至可以获得比MyISAM更好的读取性能。使用InnoDB,所有数据都使用主索引进行聚类,因此您可以使用顺序读取来检索所有数据。但是,你有一个blob的事实可能意味着一个或多个随机读取。当然,经常读取的数据留在InnoDB缓冲池中不会导致磁盘读取。
使用MyISAM,MySQL需要读取索引表(尽管它可以缓存在密钥缓冲区中)以获取指向数据表的指针(可以缓存在OS磁盘缓冲区中)。