0

CodeIgniter には、2 つのテーブルから最新の投稿を取得する機能があります。

public function get_latest_comments($amount)
{
  $query = $this->db->query('
    SELECT *, FROM_UNIXTIME(date) AS timestamp
    FROM comments
    ORDER BY timestamp DESC
    LIMIT 5
  ');

  if ($query->num_rows() > 0) {
    $result = $query->result_array();

    for ($i = 0; $i < sizeof( $result ); $i++) {
      $result[$i]['author_info'] = $this->comments_model->get_comment_author( $result[$i]['id'] );
      $result[$i]['date'] = mdate( "%M %m, %Y", $result[$i]['date'] );

      if ($result[$i]['section'] === 'blog') $loc = 'blog_posts';
      if ($result[$i]['section'] === 'core') $loc = 'public_posts';

      $this->db->select( 'title, slug' );
      $query = $this->db->get_where( $loc, array('id' => $result[$i]['location']) );

      $result[$i]['post_title'] = $query->row( 'title' );
      $result[$i]['url'] = base_url() . $result[$i]['section'] . '/view/' . $query->row( 'slug' ) . '/';
    }
    return $result;
  }
  return false;
}

問題は、実行速度が遅すぎることです。私のページは 7 ~ 8 秒で読み込まれることがあります。このクエリを 2 回実行している + 最新のコメントを収集する同様のクエリにより、ページの速度が低下していると思われます。

ループ内のクエリに嫌な予感がします。どうすればそれを回避できますか?

私のテーブルの構造は次のとおりです。

users (id, username, mail ...
user_info ( user_id, name, surname
public_posts ( id, slug, text, author(user id) ...
blog_posts ( id, slug, text ...
comments ( id, text, author, location(post_id_, section(post_table) ...
4

1 に答える 1

3

クエリを説明して確認し、mysql コマンド ラインに移動して次のように入力します。

EXPLAIN SELECT *, FROM_UNIXTIME(date) AS timestamp FROM comments ORDER BY timestamp DESC LIMIT 5

Explain は、クエリに関するすべてを教えてくれます。そのベースに基づいて、インデックス作成についても決定できます。コードで使用する前に、すべての選択クエリを説明する練習をしてください。

さらに、コードに時間がかかっていると思われる場合はいつでもプロファイリングを行うこともできます。codeigniter では Profiler クラスが利用可能です。以下のリンクを参照してください。

https://www.codeigniter.com/userguide3/general/profiling.html

于 2013-04-03T11:17:02.453 に答える