问题一 name like '%联想%' 是全表搜索,如何使用索引来优化查询?
有推荐用mysql 函数 locate/instr explain SELECT * FROM product where name like '%联想%'; explain SELECT * FROM product where LOCATE('联想',name)>0 ; explain SELECT * FROM product where instr(name, '联想')>0 ; 看着解释没什么区别啊,都是用了全表搜索
问题二 name like '%联想%' 是匹配的 XX联想XX。如何匹配 XX联XX XX想XX,现在是把搜索内容拆分了,name like '%联%' or name like '%想%'
第一个问题: 如果左边有通配符
%
的话,是无法走索引的,只能走全表扫描,最好的结果是select
中只查询索引覆盖的列,比如假设只有name
s列带索引,select name from product where name like '%联想%'
,走的是扫描整个索引,比全表扫描要快一点,但是应用很局限,一般不会只查被索引覆盖的列啊.第二个问题: 这种分词查询简单点就用全文索引, 参考这个MySQL使用全文索引(fulltext index), 如果表超级大,性能差的话, 上搜索引擎,比如
solr
,Lucene
、Sphinx
.