0

我需要在我的 PHP 代码中优化 SQL 查询,该代码由大量开销的 Web 服务使用。我正在获取单词列表。

1) 获取单词标识符

2) foreach 标识符获取单词作为 php 对象

3) 在 xml 中打印单词详细信息

现在我有一个代码在构造函数中使用这个 Word 标识符。然后当用户访问属性时会延迟加载给定的属性。Web 服务正在返回所有单词详细信息,因此它需要所有单词属性。每次进行 5-10 次简单的 sql 查询,例如获取本地词、获取外来词、获取转录。这样做是假设我一次需要更少的关于单词的信息,而另一次我需要更多的信息。

现在,当我的托管服务提供商停用我的网站因为对共享托管资源的开销影响太大时,我需要对其进行优化。1) 我将在可能的情况下提供 INDEX, UNIQUE 并且尚未使用。2)我考虑用更长的连接查询替换许多简单的sql查询,懒惰地检索单词的属性:

EXPLAIN SELECT nt.deutsch_id, nt.article, n.deutsch_word, ft.french_id, ft.article, f.french_word, p.part, fd.transcription, fd.definition
FROM translation_enfr ft
INNER JOIN translation_ende nt ON nt.translation_id = ft.translation_id
INNER JOIN deutsch n ON n.deutsch_id = nt.deutsch_id
INNER JOIN french f ON f.french_id = ft.french_id
INNER JOIN parts p ON p.part_id = ft.part_id
LEFT JOIN french_details fd ON fd.translation_id = ft.translation_id
WHERE ft.translation_id =2

你认为它会比使用更好/更快:

public function getNativeWord($withArticle = true) { 
                if(is_null($this->nativeWord)) { 
                 $q = "SELECT {$langLabel}_word FROM {$langLabel} 
                       WHERE {$langLabel}_id = :native_id";
                } 
}

当前的其他查询也类似:

"SELECT {$langLabel}_word FROM {$langLabel} WHERE {$langLabel}_id = :foreign_id"
"SELECT article FROM translation_en{$this->nativeLang} WHERE translation_id = :translation_id";
"SELECT parts.part FROM parts INNER JOIN translation ON parts.part_id = translation.part_id WHERE translation_id = :trans_id"
"SELECT transcription FROM {$langLabel}_details WHERE translation_id = :trans_id";
"SELECT definition FROM {$langLabel}_details WHERE translation_id = :trans_id";

我想预加载这个 Word 对象的每个属性,只剩下轻松加载图像句子评论,因为这里我有 1toMany 关系!

更新 1

EXPLAIN SELECT的输出...*

在mysql中解释

4

0 回答 0