我的问题很长(对此很抱歉),需要一些解释。

我有一个很大的MySQL数据库,它代表带有词定义的完整罗马尼亚语字典。定义表有〜180.000条记录。

我使用该数据库返回网站上的定义。功能之一是在定义中搜索。含义:显示包含查询中所有不同单词的所有定义。在罗马尼亚语中,根据大小写,时态等,一个单词(名词,冠词,动词)有很多屈形形式。例如,“ casa”(意思是“房子”)一词在Dative中可以是casei,在主格中可以是casei,我希望这些定义包括所有这些形式。

我设法创建了查询,但运行速度非常慢。我尝试了regexp和like子句,并选择了like子句,因为它速度更快(使用regexp时为10秒,而使用expexp为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条记录表上运行这样的查询可能会花费一些时间,但是我确定应该有解决方案。

先感谢您。

最佳答案

我只是给出一个想法,不是一个真正的答案,但评论的规模太小。
几年前,我在大型数据库上遇到了与产品相同的问题。问题是,根据法国的位置,同一产品具有不同的名称,但没有“完全不同” ...
在尝试提高速度之后,我决定以完全不同的方式工作:我在数据库中放入了两个版本的数据。一个是“真实数据”,所以我给了用户这个名字,另一个是我正在寻找的名称。
例如,如果用户尝试查找“ Good”,“ GOOD”,“ gOoD”等,则您可以在数据库中使用“ good”并进行搜索而无需考虑大小写。但是您也可以有两个条目:“ Good”(将显示)和“ GOOD”(将用于搜索)。当用户输入“好”或“好”的“好”时,将其更改为“好”,然后搜索并返回另一个字段。
我认为在您的情况下,而不是搜索:
munte,munți,muntele,muntelui,munții,munților,仅搜索“ munt”会很好。实际上,您将拥有6条记录,而其中一条带有“ MUNT”作为“搜索字段”,而另一条纬度位于同一条记录的其他字段中。
返回结果后,您只需要继续测试即可。
例如:输入Muntele,转换为Munt,搜索Munt,然后与Munt行的其他字段手动测试Muntele。

抱歉,这不是“真正的答案”,而只是一种方式。

关于mysql - MySQL中的慢查询-字典数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26515701/

10-12 13:03
查看更多