0

私の目標は単純です。さまざまなログのIPアドレスで参加します。クライアント側では、PHPを介してisset($ row [date_xy])の場合に推測している、JavaScriptエラーが発生している場所(人間やボットなど)を特定しようとしています。

このクエリは、ORDER BYがなくても正常に機能します。これをミックスに投入すると、MySQLは30%のCPU使用率にジャンプし、プロセスを強制終了する前に数秒間そこに留まります。もちろん、これはローカルでテストしています。可能な限り古いエントリには興味がないので、ORDER BYje.dateDESCを使用したいと思います。

サブ選択を試しましたが、基本的なJOINよりも面白いことをしてからしばらく経ちました。構文をSOLニュートラルに保つことが重要です。

SELECT 
je.date AS date_js, 
lb.date AS date_lb, 
lh.date AS date_lh 

FROM log_javascript_errors AS je 

LEFT JOIN log_bots AS lb ON je.ip = lb.ip 

LEFT JOIN log_humans AS lh ON je.ip = lh.ip 

ORDER BY je.date DESC 

LIMIT 20, 20
4

3 に答える 3

2

順序付けを高速化するには、log_javascript_errors.dateのインデックスを追加する必要があります。また、log_bots.ip、log_humans.ip、log_javascript_errors.ipのインデックスを使用して、結合を高速化します。

アップデート

CREATE INDEX je_date ON log_javascript_errors (date);
CREATE INDEX je_ip ON log_javascript_errors (ip);
CREATE INDEX lb_ip ON log_bots (ip);
CREATE INDEX lh_ip ON log_humans (ip);
于 2012-06-28T07:19:22.243 に答える
1

適切なインデックスを追加した後、クエリがまだ遅い場合は、次のバリエーションを試すことができます。

SELECT 
je.date AS date_js, 
lb.date AS date_lb, 
lh.date AS date_lh 

FROM 
    ( SELECT ip, date 
      FROM log_javascript_errors 
      ORDER BY date DESC
      LIMIT 40
    ) AS je 

LEFT JOIN log_bots AS lb ON je.ip = lb.ip 

LEFT JOIN log_humans AS lh ON je.ip = lh.ip 

ORDER BY je.date DESC 

LIMIT 20, 20 ;
于 2012-06-28T08:17:18.823 に答える
0

これを認めなければならないので、私は別のルートに行きました。テーブルの設計は、最初にテーブルを作成したときにこの可能性を考慮していませんでした。私たちは皆これに遭遇しました。私はSQLベンダーに依存しないCASE構文を学びましたが、いくつかの変更を加えた後でもそれを使用する必要がないことがわかったので、SQLの理解を深めてくれたおかげで受け取った2つの返信に賛成票を投じました。この質問が自分の目標に直接関連していると思う人のために、ログに表示する必要があるものを生成するために、サーバースクリプト言語を使用して残りを入力する「タイプ」列を追加することになりました。ゼロから再設計した場合、すべての「タイプ」(人間、検索エンジン、拒否)のマスターセッションテーブルを作成し、おそらくダブルLEFTJOINを試してみたと思います。

于 2012-06-30T09:55:46.807 に答える