ホームページ > バックエンド開発 > PHPチュートリアル > PHP ページに複数のクエリ ステートメントがあるため、ページを開くのが非常に遅くなります。

PHP ページに複数のクエリ ステートメントがあるため、ページを開くのが非常に遅くなります。

WBOY
リリース: 2016-06-23 13:37:56
オリジナル
1043 人が閲覧しました

以下のコードは少し面倒なので、簡単に説明します。まず、部門テーブルから部門レコードをクエリし、次に部門 ID に基づいてユーザー テーブル内の部門に対応するユーザーをクエリします。次に、ユーザー ID に基づいてログ テーブル内のユーザーに対応するログをクエリし、次にクエリを実行します。ログ ID に基づいて監査テーブルのリーダーを表示します。監査レコード...おそらくこのような感じで、一度に 1 つのレイヤーを呼び出すため、ページを開くのに約 1 分かかります。

データテーブルのスキャンが多すぎることが原因だと思いますが、解決方法がわかりません。

//部門のクエリ
$sql_Depart="SELECT * FROM 部門 WHERE gid>0 AND gid ?>

style =" width: 100%"> $sql_user="SELECT * FROM members WHERE flag ; gif">  
//すべてのログをクエリする
SELECT c1.*,c2 .* FROM log c1 LEFT JOIN log_time c2 ON (c1.time_id=c2.tid) WHERE c2.year='".$year."' AND c1.userid='".$u[' uid']."' AND c2.end_date<'".date("Y-m-d")."' ORDER BY c2.tid desc";
$query=$db->query($sql);
row=$db-& gt;fetch_array( $query)){

;font-family: Georgia">

/td & gt;&


必要ない場合は??? 、使用できます。

例:

$data = getcache(); // ??Save?Get
if($data==''){
// ?Get db?Get?? Get';
setcache($data); // ?Input?Save
}

echo $data;

クエリする必要のないコンテンツを減らすようにしてください。プロンプトが必要ない場合は、[保存] を使用できます。

例:

$data = getcache(); // ??Save?Get

if($data==''){
// ?Get db?Get?? Get';

setcache($data); // ?Input?Save

}


echo $data; これはファイルに書き込まれますか?
参考となる完全な例はありますか?

SQL ステートメントを説明し、インデックスの使用法を確認してください




プロンプトが必要ない場合は、ストレージを使用できます。

例:
$data = getcache(); // ??Save?Get
if($data==''){
// ?Get db?Get?? Get'; setcache($data); // ?Input?Save

}

echo $data; これはファイルに書き込まれますか?

参考となる完全な例はありますか?



はファイル内にあります。

http://www.itstrike.cn/Question/PHP-technology-to-achieve-dynamic-cache-instance

先生、データはファイルまたは memcache に保存できます。


ただし、ループ内でクエリを実行していますが、これ自体は行うべきではありません。 2 つのテーブル内のすべてのデータを一度にクエリしてリサイクルできます。これにより、現在の速度よりも高速になる可能性があります。

ネストされたループ クエリはひどいです


私の謙虚な意見では、ネストされたループ クエリの効率は非常に低いので、マージすることをお勧めします

SQL を最適化し、1 つの SQL 内のすべてのコンテンツを見つけて表示するようにしてください以下のループ
関連: 部門テーブルはユーザー テーブルに関連付けられ、ログ テーブルは監査テーブルに関連付けられます
並べ替え: 最初に部門 ID、次にユーザー ID、そして... (後の関係がわかりません)
条件: それはあなたのものであり、それらを統合します
クエリフィールド: 部門 ID、部門名、ユーザー ID、ユーザー名など、使用されているフィールドのみを取得します (未使用のフィールドは決して取得されません) クエリの数: 必要ありませんこれを持っていないので、大きなデータを 1 つ書くことをお勧めします。ページングなしでクエリするのは怖いです

この方法では、たった 1 つのステートメントでデータを取得できます
次に、データを走査します。データはソートされているため、データをスキャンする必要はありません。混乱するのを心配する必要があります
1 つ目は、部門を横断することです。部門 ID が異なる場合は、新しいテーブルを作成します
各部門はユーザーを横断し、異なるユーザーに遭遇したときに新しいテーブルを作成します

各ユーザー...

次の SQL が高速になるかどうかはわかりません (SQL が正しく、実行可能であるという保証はありません)

SELECT d .*,m.*,l.* FROM 部門 d

left join members m m.flag left join (SELECT c1.*,c2.* FROM log c1 LEFT JOIN log_time c2 ON (c1.time_id=c2.tid) WHERE c2.year='" .$year."' AND c2.end_date<'".date("Y-m-d")."') l on l.userid = m.uid

WHERE d.gid>0 AND d.gid<15 ORDER BY d. gid,m.flag desc,l.tid desc

ステートメントとして書かれています~

desc SQL
キーフィールドにインデックスを作成する

次の SQL が高速化できるかどうかはわかりません (SQL が正しく実行可能であるという保証はありません)

SELECT d.*,m.*, l.* FROM 部門 d
m.flag<5 および m.groupid = d.gid でメンバー m を左結合
左結合 (SELECT c1.*,c2.* FROM log c1 LEFT JOIN log_time c2 ON (c1.time_id= c2.tid) WHERE c2.year='".$year."' AND c2.end_date<'".date("Y-m-d")."') l on l.userid = m.uid
WHERE d.gid> 0 AND d.gid< ;15 ORDER BY d.gid,m.flag desc,l.tid desc



試してみましたが、クエリ効率は非常に速く、待つ必要はありませんが、ページでそれを呼び出すにはどうすればよいですか?

私の要件は、最初に部門を表示し、次に部門内のすべてのユーザーを表示することです。しかし、現在は部門、ユーザーなどがすべて一緒に表示されます。

関連付け: 部門テーブルはユーザー テーブルに関連付けられ、ログ テーブルは監査テーブルに関連付けられます
並べ替え: 最初に部門 ID、次にユーザー ID、そして... (以下は見ていません)関係を明確にします)
条件: これらはあなたのものであり、それらを統合します
クエリフィールド: 部門 ID、部門名、ユーザー ID、ユーザー名など、使用されているもののみを取得します (未使用のフィールドは決して取得されません)
クエリの数: これはありません。1 つ作成することをお勧めします。ページングなしの大きなデータ クエリはひどいです
このように、たった 1 つのステートメントでデータを取得できます
それから、データを走査することになります。ソートされているため、混乱を心配する必要はありません
最初に部門を横断し、部門 ID が異なる場合は新しいテーブルを作成します
各部門はユーザーを横断します。ユーザーが異なる場合は、新しいテーブルが作成されます。
各ユーザー...



最初のものは部門を横断します。部門 ID が異なる場合は、新しいテーブルが作成されます。
各部門はユーザーを再度横断し、新しいテーブルを作成します。は異なります

ID が異なる場合に新しいテーブルを作成するとはどういう意味ですか?
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート