Enhancement(機能追加・改善) #1898
完了[PATCH] i18nビヘイビアを使用しているテーブルへのクエリが何度も実行される
0%
説明
概要¶
「マイホーム」のページにアクセスすると、以下のようにtranslationテーブルに対するクエリが数回実行されます。
SELECT s.id AS s__id, s.name AS s__name, s.application AS s__application FROM sns_term s WHERE (s.application = 'pc_frontend' AND s.id IN (SELECT s.id AS s__id FROM sns_term_translation s2 WHERE (s2.lang = 'en'))) SELECT s.id AS s__id, s.value AS s__value, s.lang AS s__lang FROM sns_term_translation s WHERE (s.id IN ('5')) SELECT s.id AS s__id, s.value AS s__value, s.lang AS s__lang FROM sns_term_translation s WHERE (s.id IN ('1')) SELECT s.id AS s__id, s.value AS s__value, s.lang AS s__lang FROM sns_term_translation s WHERE (s.id IN ('3')) SELECT s.id AS s__id, s.value AS s__value, s.lang AS s__lang FROM sns_term_translation s WHERE (s.id IN ('9')) SELECT s.id AS s__id, s.value AS s__value, s.lang AS s__lang FROM sns_term_translation s WHERE (s.id IN ('11'))
同様なアクセスがnavigation_translationテーブルに対しても行われます。
速度面での改善があるかどうかは分かりませんが、クエリにleftJoinを使用して実行回数を減らした修正を https://github.com/upsilon/OpenPNE3/commit/cb1804b で行いました。
Shogo Kawahara さんがほぼ14年前に更新
- 題名 を i18nビヘイビアを使用しているテーブルへのクエリが何度も実行される から [PATCH] i18nビヘイビアを使用しているテーブルへのクエリが何度も実行される に変更
- 優先度 を Low(低め) から Normal(通常) に変更
We had accepted a following pull request:
https://github.com/upsilon/OpenPNE3/commit/cb1804b48b207937e173907f4a132ef8d95dae86
Shinichi Urabe さんが13年以上前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Youichi Kimura にセット
- 対象バージョン を OpenPNE 3.7.0 にセット
Youichi Kimura さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 9a2a26d06d488a9aab89ee0efa39e2a1dc73cbc1 で適用されました。
Minoru Takai さんが約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
master ブランチにおいて、管理画面のナビゲーション設定で「日本語設定の場合に、英語版名称がでない」という問題があり、原因を追ったところこのチケットでの修正 9a2a26d0 に辿り着いたので差し戻します。
i18n ビヘイビアを使用しているテーブルに関して、効率の悪い DB アクセスが発生していることを改善する方針は良いと思います。しかし、このチケット内容や 9a2a26d0 の差分を見ても、どのような問題があり、どのような方針で修正したのかが詳しく分かりませんでした。
- 修正前のコードにはどのような問題があるのか
- どこがどのように実装されているために効率が悪いのか
- どのような方針で改善が可能なのか
- leftJoinTranslation() メソッドを用意していますが、これを用いると修正前と同じ結果をより効率的に得られるのでしょうか
- 修正を加えるべき箇所はどこなのか
- opI18N クラスで $this->terms->configure('en', $application) を削除していますが、これはもともとどのような意味を持つ処理だったのでしょうか
- NavigationTable と SnsTermTable 以外にはこの修正は適用しないでよいものなのでしょうか
このコメント時点で分かっている問題は次のものです:
- 日本語と英語しか使わない前提(※)のとき、管理画面で、日本語設定の場合に、ナビゲーション設定で英語の文言が表示されない
- ※ノンカスタマイズのまま、特に OpenPNE.yml にある supported_languages が以下の設定値のままである場合。
# 対応言語 supported_languages: ['en', 'ja_JP']
- ※ノンカスタマイズのまま、特に OpenPNE.yml にある supported_languages が以下の設定値のままである場合。
- 対応言語が複数ある場合(例えば上記の設定値が ['en', 'ja_JP', 'fr', 'de'] の場合)に、管理画面で、ナビゲーション設定で、設定言語以外の文言が表示されない(英語設定時に日本語が表示されるのは例外)。
前述の通り、私がこの修正がどのような考えに基づくものなのか分かっていないので、 9a2a26d0 を見た上で改善案を示すことができません。ここで示した問題は、 NavigationTable にて leftJoinTranslation() を使っている行を削除するだけで直りますが、それはこの修正を行わない状態に戻すのと変わらないと思います。
このチケットで触れられている部分に詳しい方、あるいは実装者の方に、この問題も含めて対応が可能かどうか検討してもらえると助かります。
Youichi Kimura さんが12年以上前に更新
- ステータス を Rejected(差し戻し) から Invalid(無効) に変更
- 進捗率 を 50 から 0 に変更
note-4 の通り、当チケットでの修正に関係する別の問題が発生しているため、 9a2a26d0 をrevertします。
また、修正量に対して大きな改善も見込めないためこれ以降の修正も行わずチケットを閉じます。