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)
我刚刚回答了最近的问题:全文搜索导致大量时间花费在“全文初始化”上
由于您使用的是 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)
试一试 !!!