0

私が持っているのは、IP、ブラウザー情報のハッシュ、訪問した URL、タイムスタンプの最終訪問日を含むテーブル statistieken です。

さまざまなソースからコンパイルできたものがこのクエリにつながりました.唯一の問題は、このクエリが約15000行のテーブルで完了するのに永遠に(9分)かかるため、このクエリは非常に非効率的です.

私はこれを間違った方法で行っていると思いますが、適切な投稿や選択の結果を使用して必要な結果を得る方法のチュートリアルを見つけることができません。

私が単純に欲しいのは、過去 12 時間に 25 ページを超えてアクセスした、返された結果のハッシュと一致するテーブル内のすべてのエントリの概要です。

CREATE TABLE IF NOT EXISTS `statsitieken` (
  `hash` varchar(35) NOT NULL,
  `ip` varchar(24) NOT NULL,
  `visits` int(11) NOT NULL,
  `lastvisit` int(11) NOT NULL,
  `browserinfo` text NOT NULL,
  `urls` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

これは、これまでにコンパイルしようとしたクエリです。

SELECT * FROM `database`.`statsitieken` WHERE hash in (SELECT hash FROM `database`.`statsitieken`
where `lastvisit` > unix_timestamp(DATE_SUB(
                                    NOW(),INTERVAL 12 hour
                                    )
                                )
group by hash
having count(urls) > 25
order by urls)

私の意見では可能なはずの1秒未満のように、まともな時間でコンパイルするにはこれが必要です...

4

3 に答える 3

1

この変更されたクエリを試すことをお勧めします。サブクエリは、返されるレコードごとに実行されるのではなく、1 回だけ計算されるようになりました。

SELECT s.*
FROM `database`.`statsitieken` s, (SELECT *
FROM `database`.`statsitieken`
WHERE `lastvisit` > UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 12 HOUR))
GROUP BY hash
HAVING COUNT(urls)>25) tmp
WHERE s.`hash`=tmp.`hash`
ORDER BY s.urls

次のフィールドにインデックスがあることを確認してください。

  • hashGROUP BYとを高速化するWHERE
  • urlsをスピードアップするORDER BY
于 2012-08-03T11:55:05.253 に答える
0

を使用した派生テーブルINNER JOINは、サブクエリよりも高速です。この最適化されたクエリを試してください。

SELECT *
FROM statsitieken a
    INNER JOIN (SELECT hash
                FROM statsitieken
                WHERE lastvisit > unix_timestamp(DATE_SUB(
                                    NOW(),INTERVAL 12 hour
                                    )
                ) b
        ON a.hash = b.hash
GROUP BY a.hash
HAVING COUNT(urls) > 25
ORDER BY urls;

この選択クエリのパフォーマンスを向上させるには、次のようにインデックスを追加する必要があります。

ALTER TABLE statsitieken ADD KEY ix_hash(hash);

ALTER TABLE statsitieken ADD KEY ix_lastvisit(lastvisit);
于 2012-08-03T11:55:20.223 に答える
0
WHERE hash in (SELECT hash FROM `database`.`statsitieken`
where `lastvisit` > unix_timestamp(DATE_SUB(
                                    NOW(),INTERVAL 12 hour
                                    )
                            )

同じテーブルで「サブクエリ」を実行しています(その単語が存在するかどうかはわかりません:P、「サブクエリを実行しています」)。

where `lastvisit` > unix_timestamp(DATE_SUB(
                                    NOW(),INTERVAL 12 hour
                                    )

直接する?

于 2012-08-03T11:56:17.110 に答える