提高搜索性能

RKh*_*RKh 1 mysql sql

在我的一个MySQL表中,我有以下列:

Skills      varchar(80)
Industry    varchar(40)
Address     varchar(100)
Run Code Online (Sandbox Code Playgroud)

技能可能包括以下文本:C/C++,MS Office,Linux等.行业可能包括以下文本: 财务,IT等.地址包含完整的邮政地址以及城市名称.没有单独的城市列.

在我的网页上,我有搜索框,用户可以在其中键入每个列的关键字.我使用SQL查询,如下所示:

Select studentname where skills like '%...%';
Run Code Online (Sandbox Code Playgroud)

我想改进搜索结果和性能.例如,用户可能已经输入了像Linex而不是Linux的技能.所以,我的搜索应该返回约.比赛.

请告诉我如何使搜索更准确并提高性能.目前,我已经定义的索引skills,addressindustry列.但表现不太好.

表引擎是InnoDB.

编辑

问题是我们从各个机构收到预先填写的MS Excel表格.我们的.NET应用程序读取Excel工作表的列值并将其存储在远程数据库中.对于拆分表,我们需要更改我们的应用程序.

pax*_*blo 9

SQL子句

like '%...%'
Run Code Online (Sandbox Code Playgroud)

如果你想从数据库中获得性能,那么你可以做的最具破坏性的事情就是它.

你真正应该做的是确保技能,行业等内容被分解为具有固定值的其他表(如'C','C++','SQL'等).

然后在人与技能之间有一个多对多的表.例如:

People:
    PersonId primary key.
    Other person details.
Skills:
    SkillId primary key.
    SkillName.
    Other skill details.
PeopleSkills:
    PersonId references People(PersonId).
    SkillId references Skills(SkillId).
    primary key (PersonId,SkillId).
    index on (SkillId).
Run Code Online (Sandbox Code Playgroud)

如果您只允许从Skills表中输入搜索词,那么这种布局将大大提高查询的速度,并且不可能输入错误的数据(没有'Linex'可能你的意思'Linux',仅仅因为'Linex'不是在技​​能表中.

我在表格设计中遵循的一条无懈可击的规则是:如果您试图从列中提取一些信息,那么该信息应该放在它自己的列中.人们遭受的性能问题的数量,因为他们创建的表包含一个包含逗号分隔值的列(他们想要从该列中提取单个值)应该证明这一点.

必须确保所有技能和行业在一个单独的表格中的缺点将通过提高速度和准确性来弥补.数据库应始终设计为第三范式.如果您了解后果(并通过使用触发器或计算列减轻不正确数据的可能性),则可以将性能退回到2NF,但这很少是必要的.