MySQL中的慢查询 - 字典数据库

时间:2014-10-22 19:37:41

标签: mysql regex

我的问题很长(对不起),需要一些解释。

我有一个很大的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记录表上运行这样的查询可能需要一些时间,但我确信应该有一个解决方案。

提前谢谢。

1 个答案:

答案 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”,只是一种方式。