假设我在数据库中有400行人名.搜索他们名字的最佳方法是什么?

TIM*_*MEX 3 python mysql database indexing search

他们还会搜索他们名字的一部分.不仅是带空格的单词.如果他们输入"马特",我希望也能找回"马修".

mjv*_*mjv 12

SELECT * 
FROM mytable 
WHERE name LIKE 'matt%' OR name LIKE '[ ,-/]matt%'
Run Code Online (Sandbox Code Playgroud)

注意:
1)花式通配符.不使用更简单的LIKE'%xyz%'形式的原因是,根据xyz,数据库可以返回许多不相关的记录.例如,在"马特"搜索的情况下,"Jeff Zermatt".
第二个通配符键中的括号包括所有分隔符,这些分隔符可以表示单词之间的中断.另一种通配符模式是 [^A-Z0-9](O'Brian搜索时可能产生一些brian但可能不是坏事...)

2)表现. 因为此表中的记录很少,所以前面的通配符方法非常可行,当然也是最简单的方法. 没有理由再搜索了!
如果记录非常宽(许多字段中的一些字段长度超过30个字符),则可以创建索引name.前端通配符仍然需要扫描,但这将在索引上更窄,因此更容易适应缓存等.
事实上,如果不是SELECT *这个查询只针对myTable表的几个字段[如果此表的记录是"宽",则可以创建由所有这些字段组成的索引.
记录的数量是否会超过50,000(并且,在较小程度上,应用程序会以高于每分钟40次的速率使用类似查询"点击"数据库),您可以考虑引入更有效的处理方式关键字:全文目录或带有各个关键字的"手工制作"表.

3)另一种方法的优点.应用程序维护一个表,其中包含从全名中轻松解析的各个关键字列表的解决方案的优点,不仅提供了更好的扩展(当表和/或使用增长时),而且还引入了改进搜索的质量.
例如,它可以通过引入常用的名字昵称来改善有效回忆(比尔或威尔或比利为威廉,迪克为理查德,杰克或约翰尼为约翰等).通过更复杂的方法开辟的另一种可能性是引入Soundex或修改名称标记的Soundex编码,允许用户定位名称,即使它们可能错误拼写或忽略精确拼写(例如Wilmson vs. Wilmsen vs. Willmsonn等.)


Aar*_*ron 10

您可以使用:

SELECT * 
 FROM mytable 
WHERE name LIKE '%matt%'
Run Code Online (Sandbox Code Playgroud)

  • @OMG,我希望任何像样的SQL数据库都可以在更短的时间内选择表扫描400或400,000行来打印结果. (2认同)