首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以最快的方式搜索多个字段

以最快的方式搜索多个字段
EN

Stack Overflow用户
提问于 2016-09-08 11:28:00
回答 2查看 4K关注 0票数 2

我目前在mysql用户表中有一个名称和姓氏字段,以及一个搜索框,它们可以在其中同时输入,所以我的查询基本上是

代码语言:javascript
运行
复制
SELECT name,surname FROM user
WHERE CONCAT(name,' ',surname) LIKE '@search%'

这很好,但是在一个大表上会变得非常慢,即使名称和姓氏列都是索引的,而且当搜索被分割时,它非常快,是否有方法索引连接字段,或者当两个字段都被索引时,它们是否已经被索引,切换到全文索引会更快吗?

EN

Stack Overflow用户

回答已采纳

发布于 2016-09-08 22:07:40

我是否正确地假设@search被某种东西所取代?

如果您正在搜索“单词”,那么FULLTEXT的工作速度要快得多。但是,要注意它的局限性(停止词、最小字长等)。

这个特殊的尝试,CONCAT(name,' ',surname) LIKE '@search%',只会检查name开头的“@search”,我怀疑这是不是你想要的。你想要什么?

请记住,name LIKE '@search%'name LIKE '%search%'快得多,因为它可以使用INDEX(name),我假设您使用了INDEX(name)

如果同时拥有INDEX(name)INDEX(surname),那么这将是相当快的:

代码语言:javascript
运行
复制
SELECT ...
    WHERE name LIKE '@search%'
UNION DISTINCT
SELECT ...
    WHERE surname LIKE '@search%';

这是因为这两个索引都可以使用。否则,它们不太可能同时被使用;相反,会有一个“表扫描”。(如果您有一个旧版本的OR,那么使用MySQL就不会那么好了。)

但是,如果用户使用'%‘或'_’启动@search,则会显示为“血色”,因为前面的通配符将导致表扫描。

同时,如果您不检查各种特殊字符,您将非常容易受到SQL注入的影响!

澄清后的

由于用户是单独键入名称,所以您可以更容易地测试:

代码语言:javascript
运行
复制
WHERE name    LIKE '@name%'
  AND surname LIKE '@surname%'

然后两者都有(万一用户缩短了其中一个):

代码语言:javascript
运行
复制
INDEX(name, surname)
INDEX(surname, name)

这些都比你的好,INDEX(name), INDEX(surname)

由于数据输入似乎是一个单独的字段,所以使用客户端编程语言将其拆分为@name和@surname。(在SQL中,这是可能的,但很混乱;参见SUBSTRING_INDEX()。)

阅读有关“复合索引”的文章,了解为什么这些索引更好,以及为什么原始CONCAT效率特别低。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39389722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档