0

我有一个带有中文词典(约 300 000 行)的数据库表,用于在线词典。数据结构如下所示:

 ID     ch_smpl     pinyin     definition
 ----------------------------------------
 1       我           wǒ          I, me
 2       我们         wǒmen       we, us
 etc.

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

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

4

1 回答 1

0

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

  1. 您的 SQL 查询
  2. 您的数据库设计
  3. 你的 MySQL 配置

所以不会有“翻转这个开关,你会得到超级骗子的表现”。您将需要处理所有这些领域。除此之外,还有许多其他因素会对性能产生影响。例如:操作系统、硬盘驱动器、内存量等。

让我们从 MySQL 配置开始。您应该首先尝试 mysql 查询缓存功能。如果您主要进行读取操作,这可以提高您的性能,因为所有内容都来自缓存并且不需要 i/o 操作。

在这里阅读:关于查询缓存的 MySQL 文档

另一个重要领域是您的数据库设计或您选择的数据库引擎。基本上你有三个选择:InnoDB、MyIsam 和 Memory(还有其他的,但我真的不知道)。

据我所知 MyIsam 和 Memory 只支持表锁定而不支持行锁定。但同样,如果您主要进行读取操作,这不会影响您。一般来说,它们都比 InnoDB 快。如果我是你,我会从记忆开始,因为一切都保存在记忆中。但请注意其中的含义:您可能需要更多内存,并且如果服务器崩溃,您将丢失未保存的数据。

另一方面,InnoDB 为您提供了很多数据安全性,并且如果您配置正确,它也可以非常快。不幸的是,这是一个广阔的领域。所以我不会全部介绍。开始的一件事是将 innodb_buffer_pool_size 设置为大约 80% 的内存。因此,如果您有 10GB 的 RAM,则可以将其设置为 8GB。

如果您的服务器有超过 8 个 CPU,您可能还需要将 innodb_thread_concurrency 设置为更高的数字。您应该使用 2 * 数量的 CPU。

如果您想了解有关 MySQL 性能的更多信息,您应该喝杯咖啡并阅读此博客:MySQL 性能博客

另一件重要的事情可能是在您的某些列上使用索引。但我真的不知道它是否会在你的情况下得到回报,因为我对中文词典的了解有限;)

一般来说,您的主键字段应该有一个索引。除此之外,您可以对经常查询且很少更改的字段使用索引(索引字段上的每次更改都会使索引无效,因此必须重新编译 -> 性能问题)。

据我所知,它也应该只用于列包含大量不同数据的情况。例如,如果您有一个仅包含“男性”或“女性”的列“性别”,那么您很可能只会将索引树分成两半。如果你有 100 个用户,你最终会得到 50 行。但是,如果您对他们的电话号码使用索引(在大多数情况下该索引是唯一的),那么您最终只会得到一个更有效的行。

因此,也许您应该为ch_smpl列使用索引。

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

select * from ...

在你的情况下:如果你只想有我的定义,你应该使用这个查询:

select definition from dictionary where ch_smpl = '我'

并不是

select * from dictionary where ch_smpl = '我'

还要避免在搜索词前面带有百分号的“Like”语句,因为它会停用该列的索引。

例如:

select * from dictionary where ch_smpl like '%我'

您应该只在术语之后使用百分号:

select * from dictionary where ch_smpl like '我%'

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

于 2009-11-26T17:48:15.517 回答