你的“搜索引擎”的速度主要取决于三件事:
- 您的 SQL 查询
- 您的数据库设计
- 你的 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 '我%'
最后一条建议。正如我之前所说,没有可以翻转的特殊开关。您可以做很多事情来获得更好的性能。尝试一些事情并衡量性能。