对文本字段的查询优化

时间:2014-03-15 10:33:34

标签: mysql sql query-optimization innodb

我试图通过在代理列上设置索引来优化mysql查询,但似乎我的索引不起作用。 这是我的表:

CREATE TABLE `Test` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `country_id` INT(11) NULL DEFAULT NULL,
    `agent` TEXT NOT NULL COLLATE 'latin1_general_ci',
    PRIMARY KEY (`id`)
)
COLLATE='latin1_general_ci'
ENGINE=InnoDB

alter table test add index index_for_agent (agent(767));

explain select * from test cu WHERE cu.agent REGEXP 'bot|Spider|SiteExpl|crawler'

enter image description here

如何优化查询

1 个答案:

答案 0 :(得分:0)

如果agent具有值且只有一个值,则使用in

select *
from test cu
WHERE cu.agent in ('bot', 'Spider', 'SiteExpl', 'crawler')

然后test(agent)上的索引会非常有效。

如果代理接受多个值,则更改数据结构,因此您有另一个表,例如test_agent,每个值有一行。那么上面就可以了。

如果代理商有主要匹配项,那么“bot”应匹配“无底洞”,使用likeunion all多个语句:

select *
from test cu
where cu.agent like 'bot%'
union all
select *
from test cu
where cu.agent like 'spider%'
. . .

与场上的索引一起。

如果您要查找完整单词,请使用全文索引。请注意,您需要更改最小字长参数,因为默认值为4,并且它不会索引“bot”。

如果您需要在该字段中搜索随机字符串,那么我已经没有想法来提高性能。