Mysql对字谜求解器的多个查询

Posted

技术标签:

【中文标题】Mysql对字谜求解器的多个查询【英文标题】:Mysql multiple queries for anagram solver 【发布时间】:2012-05-17 09:53:35 【问题描述】:

我有一个名为“字典”的简单但巨大的表,它有 2 列。 ID 和单词。 我有一个 php 字谜算法,它可以创建给定单词的所有可能组合。我想检查该词是否存在于我的字典中,如果存在则显示它。但我必须使用太多查询。例如,一个 9 个字母的单词是 362880 个组合。知道如何减少数据库调用吗?

【问题讨论】:

您应该为此使用Sphinx "例如一个 9 个字母的单词是 362880 个组合"。我认为你的意思是排列。 【参考方案1】:

试试这样的:

SELECT word
FROM dictionary
WHERE word LIKE '%a%a%a%'
AND word LIKE '%n%'
AND word LIKE '%g%'
AND word LIKE '%r%'
AND word LIKE '%m%'
AND CHAR_LENGTH(word) = 7

更好的是,将排序后的字母排列与单词一起存储,并在查询时对字母进行排序。

SELECT word
FROM dictionary
WHERE sorted_word = 'aaagmnr'

sorted_word 上添加索引以获得最佳性能。

【讨论】:

根据你的业力等级,你可能不需要随机的人告诉你你很聪明,但这非常聪明。【参考方案2】:

只对一个查询尝试这样的事情,虽然我不知道这样的查询会有多有效:

$possibilities = array( "at", "ta");
$sql = 'SELECT * FROM dictionary_table 
            WHERE word IN ("' . implode( '", "', $possibilities) . '")';

这将生成 SQL 查询:

SELECT * FROM dictionary_table 
            WHERE word IN ("at", "ta")

好处是查询是动态的,所以无论有多少$possibilities,理论上这都是可行的。为了效率,我肯定会索引word 列。

【讨论】:

我只是在写同样的东西。只是,选择(显式)单词列而不是 * 更快。是的 - 确保该列已编入索引。 谢谢你,尼克。我已经尝试了其他人提供的所有解决方案,但您的解决方案是最简单、最快捷的,而且我只使用了 1 个查询!【参考方案3】:

是的,首先将所有排列直接放入php中。其次,做这样的查询

SELECT myWord FROM myTable
WHERE myWord in (LIST OF PERMUTATION FROM PHP)

LIST OF PERMUTATION 可以用这种方式计算 "' . implode( '", "', $permutations) . '"

【讨论】:

这有点有趣,像这样颠倒逻辑。不是测试单词是否在数据库中,而是测试数据库中的单词是否在排列列表中。对于长字,您可能需要增加 max_allowed_packet,如 dev.mysql.com/doc/refman/5.0/en/packet-too-large.html 中所述——此查询的大小很容易增长到数 MB。 @octern : 是的,如果你不做n 查询,你必须做类似的事情,或者做一个select 的所有单词,将它加载到内存到PHP 端和检查返回的数组中是否存在置换词之一。 如果不清楚,我是说我喜欢你的解决方案。 @octern :是的,我注意到了,但我也解释了为什么我认为这几乎是唯一的好解决方案 :)【参考方案4】:

我不知道你的表有多大,但如果你在服务器上有足够的内存,并且如果你必须在一个请求中多次执行此操作 - 将数据库加载到 php 并让 php 执行它,也许使用关联数组。

编辑: 或者:将所有组合输入一个数组,将其拆分为大小为 100 的垃圾并使用准备好的语句。

【讨论】:

以上是关于Mysql对字谜求解器的多个查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询优化器的提示(hit)

您将如何处理 PHP + MySQL 字谜求解器? [关闭]

010 --MySQL查询优化器的局限性

查询优化器的提示

对字谜求解器实施空白平铺搜索的最佳实践

mysql 里面如何处理子查询返回多个查询结果的情况