我试图通过在代理列上设置索引来优化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'
如何优化查询
答案 0 :(得分:0)
如果agent
具有值且只有一个值,则使用in
:
select *
from test cu
WHERE cu.agent in ('bot', 'Spider', 'SiteExpl', 'crawler')
然后test(agent)
上的索引会非常有效。
如果代理接受多个值,则更改数据结构,因此您有另一个表,例如test_agent
,每个值有一行。那么上面就可以了。
如果代理商有主要匹配项,那么“bot”应匹配“无底洞”,使用like
和union all
多个语句:
select *
from test cu
where cu.agent like 'bot%'
union all
select *
from test cu
where cu.agent like 'spider%'
. . .
与场上的索引一起。
如果您要查找完整单词,请使用全文索引。请注意,您需要更改最小字长参数,因为默认值为4,并且它不会索引“bot”。
如果您需要在该字段中搜索随机字符串,那么我已经没有想法来提高性能。