我建立一个逻辑来生成随机句子。为此,我有一个包含~1.000.000个实体的数据库表,其中包含三元图。
目前的逻辑是:
获取初始单词
根据第一个单词获取下一个单词
继续,直到条目与结束标志匹配为止
在php中,它看起来像这样
while($i < 30 && $last['three'] != '[end]') {
$last = getDBentry($mysqli, $last);
if($last['three'] != '[end]') {
$string .= ' ' . $last['three'];
}
$i++;
}
我把它限制在最多30个字,但即使只有10个字,也需要15秒。有没有最佳实践或良好的方法可以更好地处理这些数据量?
编辑
function getDBentry () {
...
$key = $last['two'].$last['three'];
if($single) {
$sql = "SELECT * FROM trigrams WHERE gramkey = '$key'";
} else {
$sql = "SELECT * FROM trigrams WHERE gramkey = '$key' AND amount > 1";
}
$matches = array();
if ($result = $mysqli->query($sql)) {
if($result->num_rows === 0 && $single) {
die('error no result');
}
if($result->num_rows === 0) {
return getDBentry($mysqli, $last, true);
}
while($obj = $result->fetch_object()){
array_push($matches, array('one' => $obj->one, 'two'=>$obj->two, 'three'=>$obj->three, 'amount'=>$obj->amount, 'gramkey'=>$obj->gramkey));
}
} else {
die('error');
}
...
我参加了这个主题的重要部分
表结构是
id,gramkey,one,two,three,amount-其中,一二三是单个单词,gramkey由一个和两个组成,被解析为一个字符串,使其易于访问
最佳答案
正如AlexBlex在评论中提到的,这个解决方案可以在mysql文档中找到。
通过添加一个col gramkeys的索引,性能的提高绝对是疯狂的。从大约15秒到0.1秒。
编辑:显示创建表
CREATE TABLE `trigrams` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gramkey` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`one` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`two` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`three` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`amount` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `gramkey` (`gramkey`(255))
) ENGINE=InnoDB AUTO_INCREMENT=1055131 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci