我的问题很长(对不起),需要一些解释。
我有一个很大的MySQL数据库,它代表一个带有单词定义的完整罗马尼亚语词典。定义表有大约180.000条记录。
我使用此数据库返回网站上的定义。其中一项功能是在定义中进行搜索。含义:显示包含查询的所有不同单词的所有定义。在罗马尼亚语中,根据案例,时态等,单词(名词,文章,动词)有很多弯曲形式。例如,单词 casa (表示house)可以在Dative中的casei ,或在命名复数中的案例, caselor 在Dative复数等中。我希望定义包含所有这些形式。
我设法创建了查询,但运行速度非常慢。我尝试使用regexp和like子句,然后我选择带有like子句的那个,因为它更快(10秒对35秒使用正则表达式)。
我尝试对表格进行全文索引,但它并没有减少查询运行时间。
我对三个字( apa , cascada , munte )的查询是:
SELECT htmlRep from
(SELECT htmlRep from
(SELECT htmlRep from definition
WHERE htmlRep like '%munte%'
or htmlRep like '%munți%'
or htmlRep like '%muntele%'
or htmlRep like '%muntelui%'
or htmlRep like '%munții%'
or htmlRep like '%munților%') def2
WHERE htmlRep like '%cascadă%'
or htmlRep like '%cascade%'
or htmlRep like '%cascada%'
or htmlRep like '%cascadei%'
or htmlRep like '%cascadele%'
or htmlRep like '%cascadelor%'
or htmlRep like '%cascado%') def1
WHERE htmlRep like '%apă%'
or htmlRep like '%ape%'
or htmlRep like '%apa%'
or htmlRep like '%apei%'
or htmlRep like '%apele%'
or htmlRep like '%apelor%'
or htmlRep like '%apo%'
我的问题是如何优化此查询以使其运行得更快?有办法吗?我确定它应该是。
PS:我已经包含了整个查询(包括apa,cascada,munte的所有灵活形式),因此您可以准确地看到正在发生的事情。我知道在大约0.8 GB的180.000记录表上运行这样的查询可能需要一些时间,但我确信应该有一个解决方案。
提前谢谢。
答案 0 :(得分:0)
我只是提出一个想法,而不是一个真正的答案,但评论的规模太小。 几年前,我对大型数据库中的产品存在同样的问题。问题在于,根据法国的位置,同一产品有不同的名称,但不是“真正不同”...... 在尝试提高速度之后,我决定以完全不同的方式工作:我在数据库中放入了2个版本的数据。一个是“真实数据”,所以我给了用户的名字,另一个是我正在寻找的名字。 例如,如果用户试图找到“Good”,“GOOD”,“gOoD”等,那么您可以在数据库中获得“好”并在不考虑案例的情况下进行搜索。但是你也可以有两个条目:“Good”(将显示)和“GOOD”将用于搜索。当用户输入“Good”of“good”或“GOOD”时,将其更改为GOOD,搜索并返回其他字段。 我认为在你的情况下,而不是搜索: munte,munţi,muntele,muntelui,munţii,munţilor,只搜索“munt”会很好。事实上,有6个记录,你将有一个“MUNT”作为“搜索字段”,另一个偏差在同一记录的其他字段中。 返回结果时,您将不得不继续测试。 例如:输入muntele,transforme to munt,seach for munt,然后手动测试muntele与munt line的其他区域。
很抱歉,如果它不是“真正的anwser”,只是一种方式。