Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL字典数据库中的慢速查询_Mysql_Regex - Fatal编程技术网

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

MySQL字典数据库中的慢速查询,mysql,regex,Mysql,Regex,我的问题很长(很抱歉),需要一些解释 我有一个很大的MySQL数据库,它代表一个完整的罗马尼亚字典,里面有单词定义。定义表有约180.000条记录 我使用这个数据库返回网站上的定义。其中一个功能是在定义中进行搜索。含义:显示包含查询中所有不同单词的所有定义。在罗马尼亚语中,一个词(名词、冠词、动词)有很多屈折形式,具体取决于大小写、时态等。例如,单词casa(意思是house)可以是与格形式的casei,也可以是主格复数形式的,caselor用与格复数等。我希望定义包括所有这些形式 我设法创建了

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

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

我使用这个数据库返回网站上的定义。其中一个功能是在定义中进行搜索。含义:显示包含查询中所有不同单词的所有定义。在罗马尼亚语中,一个词(名词、冠词、动词)有很多屈折形式,具体取决于大小写、时态等。例如,单词casa(意思是house)可以是与格形式的casei,也可以是主格复数形式的,caselor用与格复数等。我希望定义包括所有这些形式

我设法创建了查询,但运行速度非常慢。我尝试了使用regexp和like子句,我选择了使用like子句的一个,因为它更快(10秒比使用regexp的35秒)

我尝试对表进行全文索引,但这并没有减少查询运行时间

我对三个词(apacascadamunte)的查询如下:

我的问题是如何优化此查询,使其运行更快?有办法吗?我相信应该是这样

PS:我已经包括了整个查询(包括apa、cascada、munte的所有灵活形式),所以你可以确切地看到发生了什么。我知道在大约0,8GB的180000个记录表上运行这样的查询可能需要一些时间,但我相信应该有一个解决方案


提前谢谢。

我只是给出一个想法,不是真正的答案,但评论太少了。 几年前,我在一个大型数据库上遇到了同样的问题。问题是,根据法国的地理位置,同一种产品有不同的名称,但没有“真正的不同”。。。 在尝试提高速度之后,我决定以一种完全不同的方式工作:我在数据库中输入了两个版本的数据。一个是“真实数据”,所以我还给用户的名字,另一个是我正在寻找的。 例如,如果用户试图找到“Good”、“Good”、“Good”等等,那么您的数据库中可以有“Good”并进行搜索,而无需考虑case。但您也可以有两个条目:“Good”(将显示)和“Good”(将用于搜索)。当用户在“Good”或“Good”中输入“Good”时,将其更改为Good,搜索并返回其他字段。 我认为在你的情况下,而不是搜索: munte,munți,muntele,muntelui,munții,munților,只搜索“munt”就好了。事实上,如果有6条记录,那么其中一条记录的“搜索字段”为“MUNT”,而另一条记录的其他字段为“declination”。 在返回结果时,您只需继续测试。 例如:输入muntele,转换为munt,搜索munt,然后用munt行的另一个字段手动测试muntele


抱歉,如果它不是一个“真正的anwser”,而只是一种方式。

我将使用“%munt%”进行一个更简单的查询,然后如果找到,则优化最终集。避免
总是好的:)。您还可以返回“%munte%”的所有内容并在客户端进行筛选,这样您就可以保存服务器了CPU@Sebas:那是个好主意,但没那么容易。因为您无法确切知道弯曲开始的位置。例如,对于单词fata(girl),与格是fetei,因此它只保留f。我认为大多数的定义都包含f。另一个例子:baiat(男孩)有一个案例,它变成了baitet,另一个是baiatului,所以它有点不规则。我在另一个表中有所有这些flex表单。感谢Peter的回答,但我认为,我会遇到与上述Sebas评论相同的问题。
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%'