首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL数据库搜索

MySQL数据库搜索
EN

Stack Overflow用户
提问于 2009-11-26 21:10:45
回答 1查看 419关注 0票数 0

我有一个数据库表,里面有中文词典(大约300000行),用于在线词典。数据结构如下所示:

代码语言:javascript
复制
 ID     ch_smpl     pinyin     definition
 ----------------------------------------
 1       我           wǒ          I, me
 2       我们         wǒmen       we, us
 etc.

我不擅长php和mysql,所以问题是如何设置一个搜索引擎?我找到了一堆关于php mysql搜索的教程,我也找到了一些全文搜索的例子,但我不确定它是如何处理中文字符的。搜索的速度对我来说真的很重要。

任何关于如何为此目的组织搜索引擎的建议都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-27 01:48:16

你的“搜索引擎”的速度主要取决于三件事:

  1. Your SQL-Query
  2. Your database design
  3. Your MySQL configuration

因此,不会有“翻转这个开关,您将获得超高的性能”。您将需要处理所有这些领域。除此之外,还有许多其他因素会对性能产生影响。例如:操作系统、硬盘、内存大小等。

让我们从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使用索引。

最后但并非最不重要的是您的查询。我的第一个建议是选择尽可能少的数据。这意味着要避免像这样的查询:

代码语言:javascript
复制
select * from ...

在您的示例中:如果您只想获得我的定义,则应使用以下查询:

代码语言:javascript
复制
select definition from dictionary where ch_smpl = '我'

而不是

代码语言:javascript
复制
select * from dictionary where ch_smpl = '我'

还要避免在搜索词前面带有百分号的"Like"-Statements,因为它会停用此列的索引。

例如:

代码语言:javascript
复制
select * from dictionary where ch_smpl like '%我'

应仅在术语后面使用百分号:

代码语言:javascript
复制
select * from dictionary where ch_smpl like '我%'

最后一条建议。正如我之前所说的,没有特殊的开关可以翻转。为了获得更好的性能,您可以做很多事情。尝试一些方法并测量其性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1803595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档