我有一个数据库表,里面有中文词典(大约300000行),用于在线词典。数据结构如下所示:
ID ch_smpl pinyin definition
----------------------------------------
1 我 wǒ I, me
2 我们 wǒmen we, us
etc.我不擅长php和mysql,所以问题是如何设置一个搜索引擎?我找到了一堆关于php mysql搜索的教程,我也找到了一些全文搜索的例子,但我不确定它是如何处理中文字符的。搜索的速度对我来说真的很重要。
任何关于如何为此目的组织搜索引擎的建议都是非常感谢的。
发布于 2009-11-27 01:48:16
你的“搜索引擎”的速度主要取决于三件事:
因此,不会有“翻转这个开关,您将获得超高的性能”。您将需要处理所有这些领域。除此之外,还有许多其他因素会对性能产生影响。例如:操作系统、硬盘、内存大小等。
让我们从MySQL配置开始。您应该先试用mysql查询缓存功能。如果你主要是读操作,这可以提高你的性能,因为所有的东西都来自缓存,不需要i/o操作。
点击此处阅读:MySQL Documentation on Query Cache
另一个重要的方面是您的数据库设计或您选择的数据库引擎。基本上你有三个选择: InnoDB,MyIsam和Memory (还有其他的,但我不太了解它们)。
据我所知,MyIsam和Memory只支持表锁,不支持行锁。但同样,如果你主要做读操作,这不会影响你。一般来说,它们都比InnoDB快。如果我是你,我会从记忆开始,因为一切都保存在内存中。但要注意其中的含义:您可能需要更多内存,并且如果服务器崩溃,您将丢失未保存的数据。
另一方面,InnoDB为您提供了大量的数据安全性,如果配置正确,它也可以非常快。不幸的是,这是一个很大的区域。所以我不会全部讲完。首先要做的一件事是将innodb_buffer_pool_size设置为内存的80%左右。因此,如果您有10 8GB的RAM,您可以将其设置为8 8GB。
如果您的服务器有8个以上的CPU,您可能还希望将innodb_thread_concurrency设置为更高的数字。您应该使用2*个CPU。
如果你想了解更多关于MySQL性能的信息,你应该喝杯咖啡,阅读这个博客:MySQL performance blog
另一件重要的事情可能是在你的一些列上使用索引。但由于我对汉语词典的了解有限,我真的不知道它在你的情况下是否会有回报;)
一般来说,你的主键字段应该有一个索引。除此之外,您还可以对经常查询且很少更改的字段使用索引(索引字段的每一次更改都会使索引失效,因此必须重新编译->性能问题)。
据我所知,它也应该只在列包含大量不同数据的情况下使用。例如,如果您有一个列"gender“,它只包含”男性“或”女性“,那么您很可能只会将索引树一分为二。如果你有100个用户,你最终会得到50行。但是,如果您使用他们的电话号码的索引,这在大多数情况下是唯一的,您将最终只有一行更有效。
因此,您可能应该对列ch_smpl使用索引。
最后但并非最不重要的是您的查询。我的第一个建议是选择尽可能少的数据。这意味着要避免像这样的查询:
select * from ...在您的示例中:如果您只想获得我的定义,则应使用以下查询:
select definition from dictionary where ch_smpl = '我'而不是
select * from dictionary where ch_smpl = '我'还要避免在搜索词前面带有百分号的"Like"-Statements,因为它会停用此列的索引。
例如:
select * from dictionary where ch_smpl like '%我'应仅在术语后面使用百分号:
select * from dictionary where ch_smpl like '我%'最后一条建议。正如我之前所说的,没有特殊的开关可以翻转。为了获得更好的性能,您可以做很多事情。尝试一些方法并测量其性能。
https://stackoverflow.com/questions/1803595
复制相似问题