MySQL全文选择性能

use*_*653 5 mysql myisam full-text-search wamp

我在一个表中有1.5M行。以下是表创建代码:

CREATE TABLE `jobs` (
    `id` INT(8) NOT NULL AUTO_INCREMENT,
    `job_id` VARCHAR(50) NOT NULL DEFAULT '',
    `title` VARCHAR(255) NOT NULL DEFAULT '',
    `company` VARCHAR(255) NOT NULL DEFAULT '',
    `city` VARCHAR(50) NOT NULL DEFAULT '',
    `state` VARCHAR(50) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    UNIQUE INDEX `job_id` (`job_id`),
    FULLTEXT INDEX `search` (`title`, `company`, `city`, `state`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
Run Code Online (Sandbox Code Playgroud)

下面的查询大约需要0.3秒,这是非常高的。

SELECT id 
     , title 
     , company 
     , state 
     , city 
FROM `jobs` 
WHERE MATCH (title, company, state, city) AGAINST
('senior software engineer in san fransisco california')  
LIMIT 0,10
Run Code Online (Sandbox Code Playgroud)

如何减少执行时间并仍然提供相关结果?有什么建议?

到目前为止,我尝试了以下方法,但根本没有改进。

  • 在包含 4 个数据字段的单个字段中搜索但没关系。

  • 在布尔模式>1 或>2 中使用,但它给了我不相关的结果

  • 修复表,将key_buffer_size从16MB增加到1GB,表类型改为Innodb,字符集由utf8改为latin1。

  • 从默认值设置 ft_max_word_len=1 和 ft_stopword_file=''。

  • 我在网上搜索了很多小时,但到目前为止没有运气。

“解释选择...”输出:

id;select_type;table;type    ;possible_keys;key   ;key_len;ref;rows;Extra
1 ;SIMPLE     ;jobs ;fulltext;search       ;search;0      ;\N ;1   ;Using where
Run Code Online (Sandbox Code Playgroud)

编辑:显示配置文件输出:

|| *Status*                || *Duration* ||
|| starting                || 0.000087   ||
|| checking permissions    || 0.000011   ||
|| Opening tables          || 0.000036   ||
|| init                    || 0.000030   ||
|| System lock             || 0.000013   ||
|| optimizing              || 0.000010   ||
|| statistics              || 0.000021   ||
|| preparing               || 0.000008   ||
|| FULLTEXT initialization || 0.276820   ||
|| executing               || 0.000010   ||
|| Sending data            || 0.000155   ||
|| end                     || 0.000008   ||
|| query end               || 0.000004   ||
|| closing tables          || 0.000016   ||
|| freeing items           || 0.000703   ||
|| cleaning up             || 0.000018   ||
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 2

我刚刚回答了最近的问题:全文搜索导致大量时间花费在“全文初始化”上

由于您使用的是 MyISAM,我建议重构您的查询

这是我提出的查询

SELECT id, 
title, 
company, 
state, 
city 
FROM `jobs` 
WHERE MATCH (title, company, state, city) AGAINST
('senior software engineer in san fransisco california')  
LIMIT 0,10


SELECT B.id, 
B.title, 
B.company, 
B.state, 
B.city 
FROM
(SELECT id FROM`jobs` 
WHERE MATCH (title, company, state, city) AGAINST
('senior software engineer in san fransisco california')  
LIMIT 0,10) A
LEFT JOIN `jobs` USING (id);
Run Code Online (Sandbox Code Playgroud)

试一试 !!!