2012-05-04 2 views
2

私の教義の発見の1つがなぜとても遅くなっているのか理解しようとしています。私はどこから始めるべきか本当に分からないので、私に負担してください。遅い教義が見つかる

私はかなり基本的なfindを実行してユーザオブジェクトを取得します。この発見は約160msかかる。 phpmyadminでクエリを実行すると、0.7msかかる。

$this->em->find('Entities\User', $userId) 

私は既にmysqlのmy.cnfにskip-name-resolveを追加しようとしました。ユーザーテーブルのidフィールドにはインデックスが付けられます。私は本当に他に何を試すべきか分からない。私が提供できる追加情報があれば教えてください。以下は

実体ファイルである:

namespace Entities; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\EntityRepository; 

/** @Entity(repositoryClass = "Entities\UserRepository") 
    * @Table(name="user") 
    */ 
class User extends \Company_Resource_AbstractEntity 
{ 
    /** @Id @Column(type="integer") @GeneratedValue */ 
    protected $id; 
    /** @Column(type="string") */ 
    protected $name; 
    /** @Column(type="string") */ 
    protected $password; 
    /** @Column(type="string") */ 
    protected $email; 
    /** @Column(type="string") */ 
    protected $first_name; 
    /** @Column(type="string") */ 
    protected $last_name; 
    /** @Column(type="integer") */ 
    protected $password_reset; 
    /** @Column(type="string") */ 
    protected $salt; 
    /** @Column(type="integer") */ 
    protected $active; 
    /** @Column(type="string") */ 
    protected $cookie_hash; 

    /** 
    * @ManyToOne(targetEntity="Company" , inversedBy="user") 
    */ 
    protected $company; 

    /** 
    * @ManyToOne(targetEntity="Privilege" , inversedBy="user") 
    */ 
    protected $privilege; 

    /** 
    * @OneToMany(targetEntity="CompanySubscription" , mappedBy="user") 
    */ 
    protected $subscription; 

    /** 
    * @OneToMany(targetEntity="EquipmentEvent" , mappedBy="check_in_user") 
    */ 
    protected $check_in; 

    /** 
    * @OneToMany(targetEntity="EquipmentEvent" , mappedBy="check_out_user") 
    */ 
    protected $check_out; 

    /** 
    * @OneToMany(targetEntity="GroupEvent" , mappedBy="check_in_user") 
    */ 
    protected $check_in_group; 

    /** 
    * @OneToMany(targetEntity="GroupEvent" , mappedBy="check_out_user") 
    */ 
    protected $check_out_group; 

    /** 
    * @OneToMany(targetEntity="Maintenance" , mappedBy="submit_user") 
    */ 
    protected $maintenance_submit; 

    /** 
    * @OneToMany(targetEntity="Maintenance" , mappedBy="completed_user") 
    */ 
    protected $maintenance_complete; 

    /** 
    * @OneToMany(targetEntity="UserLogin" , mappedBy="user") 
    */ 
    protected $login; 
} 

抽象エンティティ:

use \Doctrine\Common\Collections\ArrayCollection; 

abstract class Company_Resource_AbstractEntity implements ArrayAccess 
{ 
    public function offsetExists($offset) 
    { 
     return property_exists($this, $offset); 
    } 

    // The get/set functions should check to see if an appropriately named function exists before just returning the 
    // property. This way classes can control how data is returned from the object more completely. 
    public function offsetGet($offset) 
    { 
     $property = new Zend_Filter_Word_UnderscoreToCamelCase(); 
     $method = 'get'. $property->filter($offset); 
     return $this->{$method}(); 
    } 

    public function offsetSet($offset, $value) 
    { 
     $property = new Zend_Filter_Word_UnderscoreToCamelCase(); 
     $method = 'set'. $property->filter($offset); 
     return $this->{$method}($value); 
    } 

    public function offsetUnset($offset) 
    { 
     // can't do this 
    } 

    /*==-====-====-====-====-====-====-====-====-====-====-==*/ 

    /* 
    * Provides magic method access for getFieldName() and setFieldName() 
    * where field_name is a simple field and not a relation 
    * A special getData implementation returns all of the current object vars 
    */ 
    public function __call($method, $arguments) 
    { 
     preg_match('@^([a-z]+)(.*)@', $method, $matches); 
     $action = $matches[1]; 
     $property = $matches[2]; 
     $underscore = new Zend_Filter_Word_CamelCaseToUnderscore(); 
     $offset = strtolower($underscore->filter($property)); 
     if ($action == 'get') 
     { 
      if ($property == 'Data') 
       return get_object_vars($this); 
      if ($this->offsetExists($offset)) 
       return $this->{$offset}; 
      else 
       throw new Zend_Exception(sprintf("'%s' does not have property '%s'", get_class($this), $offset)); 
     } 
     else if ($action == 'set') 
     { 
      if ($this->offsetExists($offset)) 
       return $this->{$offset} = $arguments[0]; 
      else 
       throw new Zend_Exception(sprintf("'%s' does not have property '%s'", get_class($this), $offset)); 
     } 
     else 
      throw new Zend_Exception(sprintf("'%s' does not have method '%s'", get_class($this), $method)); 
    } 
} 

検索が生成するSQL:

SELECT t0.id AS id1, 
t0.name AS name2, 
t0.password AS password3, 
t0.email AS email4, 
t0.first_name AS first_name5, 
t0.last_name AS last_name6, 
t0.password_reset AS password_reset7, 
t0.salt AS salt8, 
t0.active AS active9, 
t0.cookie_hash AS cookie_hash10, 
t0.company_id AS company_id11, 
t0.privilege_id AS privilege_id12 
FROM user t0 WHERE t0.id = ? 

誰もが何か問題を参照するか、どこへ行く知っていますさらにこれで?

Doctrineの使用2.2.2。

私はphpMyAdminにして、そのクエリを実行すると、私が得る説明:http://i.imgur.com/wWeGO.png

テーブルスキーマ:http://i.imgur.com/BQsRX.jpg

+3

私はあなたでしたが、私はクエリログを有効にします。それにより、クエリログファイルの末尾と実行されている正確なクエリを確認できます。おそらくあなたが気づいていないシーンの裏に何か起こっていることがあります。あなたはRDBMSにタグを付けませんでしたが、私はMySQLを前提としていますか?もしそうなら、ここで説明されている手順を使ってクエリログを有効にすることができます:http://melikedev.com/2012/03/22/mysql-enable-query-logging/。クエリを見つけたら、MySQLのコマンドラインから実行し、パフォーマンスの違いがあるかどうかを確認し、スキーマを調整してパフォーマンスを向上させます。 –

+0

私の無知を許してください。私はZendFrameworkアプリケーションのためにそれをどこでやるのですか?また、php.netがダウンしているようです。 – tubaguy50035

+1

実際には、これらのコマンドはMySQLのコマンドラインから実行します。基本的に、私はそれがあなたの遅さを引き起こしているコードの問題だとは思わない、私はそれがデータベース/スキーマに関連していると思う。だから私はあなたのコードを裂く前に、最初にそれを解き放つものとして取り除きたいと思っていました。 –

答えて

1

私は私のセットアップに問題がファイルの行の実際の数だったと信じています。ドクトリンは毎回それらを読んでいました。私は、メタキャッシュのためにAPCを有効にし、ロード時間は最初の負荷の後に劇的に減少しました。クエリや結果キャッシュがなければ、そのクエリは約6 MSしか必要としません。これは私が全面的に目指していたものです。私は早くその試みをしたいと思っています。

+1

コンパイル時にファイルのサイズが原因で遅くなっているとお考えですか? APCはオペコード・キャッシングであり、後続の要求でファイルをコンパイルする必要がないという点でのみ役立ちます。私はこれがあなたの遅さの原因だとは思っていませんが、それがあなたのために働くのであれば... –

+0

私は本当に他のことが分かりません。 – tubaguy50035

+1

あなたが開発環境を持っていたなら、あなたがコメントで言及したようにクエリログを尾引きすることができます。そして、各要求に対して実行されたすべてのクエリが表示されます。私はあなたの直感が正しいかもしれないと思っています、それは遅さを引き起こしている関係の一つです。 –

関連する問題