我建立一个逻辑来生成随机句子。为此,我有一个包含~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

09-06 17:00