私は、Web サイトのコース ページへのユーザー アクセスを追跡しています。これを行っているのは、特定のコース (別名製品) について、ユーザーがアクセスした上位の他のコース ページのリストを取得できるようにするためです。現在のページも訪問した人です。特徴。
私が持っているものは機能していますが、収集されたデータが増え続けるにつれて、クエリ時間はかなり遅くなります. 現在、約 30 万件のレコードがあり、クエリにはそれぞれ 2 秒以上かかっています。約 2M レコードに達したらデータのトリミングを開始する予定ですが、現在直面しているパフォーマンスの問題を考えると、これは不可能だと思います。私がこれをどのように行っているかについて、より良いアプローチがあるかどうか知りたいです。
ここに悲惨な詳細があります...
ユーザー ID、コース番号、タイムスタンプを含む単純な 3 列の InnoDB テーブルがあります。ユーザー ID とコース番号のフィールドは、ユーザー ID とコース番号の組み合わせと同様にインデックス化されます。テーブル スキーマは次のとおりです。
CREATE TABLE IF NOT EXISTS `coursetracker` (
`user` varchar(38) NOT NULL COMMENT 'user guid',
`course` char(8) NOT NULL COMMENT 'subject code and course number',
`visited` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'last visited time',
UNIQUE KEY `ndx_user_course` (`user`,`course`),
KEY `ndx_user` (`user`),
KEY `ndx_course` (`course`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='tracking user visits to courses';
テーブル内のデータは次のようになります。
user | course | visited
=======================================|==========|====================
{00001A4C-1DE0-C4FB-0770-A758A167B97E} | OFFC2000 | 2013-01-19 23:18:03
{00001FB0-179E-1E28-F499-65451E5C1465} | FSCT8481 | 2013-01-30 13:12:29
{0000582C-5959-EF2B-0637-B5326A504F95} | COMP1409 | 2013-01-13 16:09:42
{0000582C-5959-EF2B-0637-B5326A504F95} | COMP2051 | 2013-01-13 16:20:41
{0000582C-5959-EF2B-0637-B5326A504F95} | COMP2870 | 2013-01-13 16:25:41
{0000582C-5959-EF2B-0637-B5326A504F95} | COMP2920 | 2013-01-13 16:24:40
{00012C64-2CA1-66DD-5DDC-B3714BFC91C3} | COMM0005 | 2013-02-18 21:32:36
{00012C64-2CA1-66DD-5DDC-B3714BFC91C3} | COMM0029 | 2013-02-18 21:34:04
{00012C64-2CA1-66DD-5DDC-B3714BFC91C3} | COMM0030 | 2013-02-18 21:34:50
{00019F46-6664-28DD-BCCD-FA6810B4EBB8} | COMP1409 | 2013-01-16 15:48:49
特定のコース (この例では COMP1409) に関連するコースを取得するために使用しているサンプル クエリは、次のようになります。
SELECT `course`,
count(`course`) c
FROM `coursetracker`
WHERE `user` IN
(SELECT `user`
FROM `coursetracker`
WHERE `course` = 'COMP1409')
AND `course` != 'COMP1409'
GROUP BY `course`
ORDER BY c DESC LIMIT 10
このクエリの結果は次のようになります。
course | c
=========|====
COMP1451 | 470
COMP1002 | 367
COMP2613 | 194
COMP1850 | 158
COMP1630 | 156
COMP2617 | 126
COMP2831 | 119
COMP2614 | 95
COMP1911 | 79
COMP1288 | 76
したがって、上記のすべては、パフォーマンスを除いて、私が望むとおりに機能します。テーブルは非常に単純なので、インデックスを作成する必要はありません。SQL クエリの結果、探しているデータが得られます。これをより速く行う方法についてのアイデアがありません。アプローチに関するフィードバックをいただければ幸いです。