3

私は新しいダッシュボードをコーディングしてきました。主に行をカウントして結果を変数に設定するなど、さまざまなDB統計を表示したいのですが、すべてが正しく機能しているのですが、多くのユーザーがページを入力または更新しています。

あなたの入力に感謝します:)

$tbl_players = players;

$xbox = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'XBOX360'");
$ps3 = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'PS3'");
$pc = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'PC'");
$xbfa = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'XBOX360' && fathread LIKE 'http%'");
$psfa = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'PS3' && fathread LIKE 'http%'");
$pfa = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'PC' && fathread LIKE 'http%'");
$xbcr = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'XBOX360' && crthread LIKE 'http%'");
$pscr = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'PS3' && crthread LIKE 'http%'");
$pcr = mysql_query("SELECT * FROM $tbl_players WHERE Console = 'PC' && crthread LIKE 'http%'");
while($row = mysql_fetch_array($xbox))
    {
$cxbox = mysql_num_rows($xbox);
}
while($row = mysql_fetch_array($ps3))
    {
$cps3 = mysql_num_rows($ps3);
}
while($row = mysql_fetch_array($pc))
    {
$cpc = mysql_num_rows($pc);
}
while($row = mysql_fetch_array($xbfa))
    {
$xboxfa = mysql_num_rows($xbfa);
}
while($row = mysql_fetch_array($psfa))
    {
$ps3fa = mysql_num_rows($psfa);
}
while($row = mysql_fetch_array($pfa))
    {
$pcfa = mysql_num_rows($pfa);
}
while($row = mysql_fetch_array($xbcr))
    {
$xboxcr = mysql_num_rows($xbcr);
}
while($row = mysql_fetch_array($pscr))
    {
$ps3cr = mysql_num_rows($pscr);
}
while($row = mysql_fetch_array($pcr))
    {
$pccr = mysql_num_rows($pcr);
}

$tbl_interactive = interactive;

$maximum = mysql_query("SELECT ID FROM $tbl_interactive ORDER BY ID DESC LIMIT 1");
while($max = mysql_fetch_array($maximum))
{
$cint = $max['ID'];
}
$xboxf = mysql_query("SELECT * FROM $tbl_interactive WHERE Console = 'XBOX360' && Type = 'Player' && $date < EndTime");
$xboxc = mysql_query("SELECT * FROM $tbl_interactive WHERE Console = 'XBOX360' && Type = 'Club' && $date < EndTime");
$ps3f = mysql_query("SELECT * FROM $tbl_interactive WHERE Console = 'PS3' && Type = 'Player' && $date < EndTime");
$ps3c = mysql_query("SELECT * FROM $tbl_interactive WHERE Console = 'PS3' && Type = 'Club' && $date < EndTime");
$pcf = mysql_query("SELECT * FROM $tbl_interactive WHERE Console = 'PC' && Type = 'Player' && $date < EndTime");
$pcc = mysql_query("SELECT * FROM $tbl_interactive WHERE Console = 'PC' && Type = 'Club' && $date < EndTime");
while($row = mysql_fetch_array($xboxf))
    {
$xboxfi = mysql_num_rows($xboxf);
}
while($row = mysql_fetch_array($xboxc))
    {
$xboxci = mysql_num_rows($xboxc);
}
while($row = mysql_fetch_array($ps3f))
    {
$ps3fi = mysql_num_rows($ps3f);
}
while($row = mysql_fetch_array($ps3c))
    {
$ps3ci = mysql_num_rows($ps3c);
}
while($row = mysql_fetch_array($pcf))
    {
$pcfi = mysql_num_rows($pcf);
}
while($row = mysql_fetch_array($pcc))
    {
$pcci = mysql_num_rows($pcc);
}

どうもありがとう!

4

6 に答える 6

2

適切なインデックス(必要に応じてインデックス)が用意されていることを確認します。

また、多くの行を選択してから行数のみを使用する代わりに、COUNTを使用することもできます。これは、次のようなクエリが原因です。

SELECT * FROM $tbl_players WHERE Console = 'XBOX360'

...大量のデータを送り返していますが、それを使用していないため、帯域幅が無駄になり、余分な読み込み時間が不要になります。一緒に行く方が良い:

SELECT COUNT(*) FROM $tbl_players WHERE Console = 'XBOX360'

...次に、適切なPHPを配置して、カウントのみを取得します。

于 2013-01-22T22:37:25.617 に答える
1

はい、それはクエリが多すぎ、オーバーヘッドが多すぎ、必要な結果セットを取得するには手間がかかりすぎます。

$tbl_playersこれらの9つのカウントすべてを、1つのステートメントと1つの行でテーブルから取得できます。あなたが持っているこれらの9つの別々のステートメントは、9つの別々の結果セットを準備しており、カウントを取得するためだけに、結果セット内のすべての行をクライアントにフェッチしています。(おそらくどこかに最適化がありますが、MySQLはクライアントに返すためにそれらすべての行を準備しています。)次のようなステートメントを使用して、MySQLに必要なカウントを返すだけの方がはるかに効率的です。

SELECT SUM(IF(p.Console = 'XBOX360' ,1,0))                             AS xbox
     , SUM(IF(p.Console = 'PS3'     ,1,0))                             AS ps3
     , SUM(IF(p.Console = 'PC'      ,1,0))                             AS pc
     , SUM(IF(p.Console = 'XBOX360' AND p.fathread LIKE 'http%' ,1,0)) AS xbfa
     , SUM(IF(p.Console = 'PS3'     AND p.fathread LIKE 'http%' ,1,0)) AS psfa
     , SUM(IF(p.Console = 'PC'      AND p.fathread LIKE 'http%' ,1,0)) AS pfa
     , SUM(IF(p.Console = 'XBOX360' AND p.crthread LIKE 'http%' ,1,0)) AS xbfr
     , SUM(IF(p.Console = 'PS3'     AND p.crthread LIKE 'http%' ,1,0)) AS pscr
     , SUM(IF(p.Console = 'PC'      AND p.crthread LIKE 'http%' ,1,0)) AS pcr
  FROM $tbl_players p

これにより、9つの値を持つ単一の行に戻ります。これにより、取得するコードの量が大幅に削減され、パフォーマンスが大幅に向上します。

$tbl_interactive同様に、 1つのステートメントでテーブルからこれらすべてのカウントを取得することもできます。

SELECT SUM(IF(t.Console = 'XBOX360' AND t.Type = 'Player' ,1,0)) AS xbfi
     , SUM(IF(t.Console = 'XBOX360' AND t.Type = 'Club'   ,1,0)) AS xbci
     , SUM(IF(t.Console = 'PS3'     AND t.Type = 'Player' ,1,0)) AS psfi
     , SUM(IF(t.Console = 'PS3'     AND t.Type = 'Club'   ,1,0)) AS psci
     , SUM(IF(t.Console = 'PC'      AND t.Type = 'Player' ,1,0)) AS pcfi
     , SUM(IF(t.Console = 'PC'      AND t.Type = 'Club'   ,1,0)) AS pcci
  FROM $tbl_interactive t
 WHERE t.Console IN ('XBOX360','PS3','PC')
   AND t.Type IN ('Player','Club')
   AND $date < t.EndTime

while($row = mysql_fetch_array($tbl_interactive_counts))
{
    $xboxfi = $row["xbfi"];
    $xboxci = $row["xbci"];
    $ps3fi  = $row["psfi"];
    $ps3ci  = $row["psci"];
    $pcfi   = $row["pcfi"];
    $pcci   = $row["pcci"];
}

ファローアップ:

NULL述語を満たす(つまり、WHERE句に一致する)行がない場合、上記のSQLステートメントがゼロではなくを返す可能性があります。ステートメントがNULLの代わりにゼロのカウントを返すようにするには、MySQLIFNULL()関数を便利な省略形として使用できます。

SELECT IFNULL(SUM(IF(t.Console = 'XBOX360' AND t.Type = 'Player' ,1,0)),0) AS xbfi
     , IFNULL(SUM(IF(t.Console = 'XBOX360' AND t.Type = 'Club'   ,1,0)),0) AS xbci
     , IFNULL(SUM(IF(t.Console = 'PS3'     AND t.Type = 'Player' ,1,0)),0) AS psfi
     , IFNULL(SUM(IF(t.Console = 'PS3'     AND t.Type = 'Club'   ,1,0)),0) AS psci
     , IFNULL(SUM(IF(t.Console = 'PC'      AND t.Type = 'Player' ,1,0)),0) AS pcfi
     , IFNULL(SUM(IF(t.Console = 'PC'      AND t.Type = 'Club'   ,1,0)),0) AS pcci
  FROM $tbl_interactive t
 WHERE t.Console IN ('XBOX360','PS3','PC')
   AND t.Type IN ('Player','Club')
   AND $date < t.EndTime

式をラップしただけであることに注意してください。 IFNULL(expr,0)

これは、次と同等の省略形です。 IF(expr IS NULL, 0, expr)

また、ANSI規格と同等です。 CASE WHEN expr IS NULL THEN 0 ELSE expr END

(を使用IFNULLすると、1回だけ指定する必要がありますexpr。)


または、MySQLにNULLを返させ、PHPでNULLのゼロによる置換を処理することもできます。$row(配列内のフェッチされた値には引き続きが含まれますNULLが、スカラーにはゼロが割り当てられることに注意してください。

$xboxfi = is_null($row["xbfi"]) ? 0 : $row["xbfi"] ;
于 2013-01-22T22:51:18.620 に答える
0

9回のラウンドトリップを必要とする9つのリクエストをサーバーに送信しています。UNION ALL単一のリクエストを使用しないのはなぜですか?プログラムについて十分に理解していないので、再設計を検討することをお勧めします。

于 2013-01-22T22:38:15.680 に答える
0

テーブルの内容によっては、集計クエリを使用して必要な情報を取得できる場合があります。

SELECT COUNT(*) `total`, Console, fathread 
FROM $tbl_players
GROUP BY Console, fathread
于 2013-01-22T22:38:56.727 に答える
0

COUNT各カテゴリのエントリ数を数えているだけなので、とを使用してほとんどのクエリを削除できますGROUP BY。例:

$tbl_players_result = mysql_query("SELECT Console, COUNT(*) AS item_count FROM $tbl_players GROUP BY Console");
while($row = mysql_fetch_assoc($tbl_players_result))
{
    /* Testing... */
    print($row["Console"] . " - " . $row["item_count"] . " items");
}

追加の条件(fathread、crthread)を使用して、クエリに対して同じことを行うことができます。

また、結果ごとに1回だけ呼び出す必要があるため、これらのループもmysql_num_rows必要ありません。while

于 2013-01-22T22:46:09.403 に答える
0

多くのCMSシステムとオンラインショップは、1回の更新で50以上のクエリを実行します。

とにかく-あなたの場合-私はいくつかの最適化の可能性を見ています。たとえば、1つのクエリで多くのタイプとコンソールに関する情報を読み取ってから、PHPで返されたデータの処理/フィルタリングに関する作業を行うことができます。たぶん、PHPでいくつかの簡単で中程度の演習(配列、結果のフェッチ、foreachループ)と少しのMySQLトレーニングを行う必要があります。それはあなたに大いに役立ちます。最も時間効率の良い教材は、ニューボストンまたはPHPアカデミーにあると思います。多くの貴重なビデオチュートリアルがあります。

完全な解決策は提供しません(時間がかかりすぎる可能性があります)。クエリの最終的な目的はわかりませんが、1つのクエリに統合することから始めることができます。

多分このように?

SELECT * FROM $tbl_interactive 
WHERE 
    Console IN('XBOX360', 'PS3', 'PC') && 
    Type in('Player','Club') && 
    $date < EndTime

行数のみを取得する場合は*、PHPで結果セットの行数を使用してカウントしないでください。

1つのフィールドまたはcount(*)関数を使用します。いくつかのフィールドを追加GROUP BYし、これらのフィールドを結果に追加すると(カウントの後または前)、カウント結果がいくつかのオプションを含むいくつかの行に分割され、行のカウントがグループに影響を与えます。

例で数え、グループ化します。

SELECT Type, Console, count(*) FROM $tbl_interactive 
WHERE 
    Console IN('XBOX360', 'PS3', 'PC') && 
    Type in('Player','Club') && 
    $date < EndTime
GROUP BY Type, Console

もちろん、返された行の数ではなく、結果セットを読み取る必要があります。

MySQLワークベンチまたはphpmyadminで試して、どのように機能するかを確認してください。

于 2013-01-22T22:53:33.917 に答える