我有一个问题,我得到了一组单词,我必须通过 foreach 将它们中的每一个插入到 DB 中,但是整个事情运行得太慢了。
foreach($words as $word) {
// even more checks
if(strlen($word) < 3) continue;
$word = $this->db->escapeString(strtolower($word));
// word not found?
$result = $this->db->querySingle("SELECT id FROM words WHERE word = '{$word}'");
if(!$result) {
$this->db->exec("INSERT INTO words (word) VALUES ('{$word}')");
$this->db->exec("INSERT INTO search (reply, word) VALUES ('{$id}', '{$this->db->lastInsertRowID()}')");
// word found
} else $this->db->exec("INSERT INTO search (reply, word) VALUES ('{$id}', '{$result}')");
}
基本上可以说 $words = array('hello', 'kitten'); 在该 foreach 中,它将获取我的第一个单词 (hello) 并检查它是否存在于单词表中。如果它找不到单词,它将把它插入那里,并将它插入到另一个表中,其中的变量 $id 在 foreach 中不会改变。但是,如果它找到了该单词,它将直接将其插入到第二个表中。之后它将使用第二个单词(小猫)并做同样的事情。
使用 php5 和 sqlite3
$this->db = new \SQLite3(ROOT . DS . 'db' . DS . 'app.db');
有问题的桌子很轻
CREATE TABLE words (id INTEGER PRIMARY KEY AUTOINCREMENT, word TEXT);
CREATE TABLE search (reply INTEGER, word INTEGER);
CREATE INDEX search_reply_idx ON search (reply);
CREATE INDEX search_word_idx ON search (word);
对于 10-15 个单词,这在大多数情况下都可以正常工作,但如果我有超过 150 个单词,它会慢到 8 秒。我可以将查询合并为一个吗?我错过了什么吗?
谢谢。