我正在跟蹤用戶訪問我們網站上的課程頁面。我這樣做是爲了對任何給定的課程(又名產品),我可以列出用戶訪問過的頂級其他課程頁面,他們也訪問了當前頁面 - 就像亞馬遜的「瀏覽此項目的客戶也瀏覽了」特徵。MySQL - 選擇表中的相關項目
我的工作是,但隨着收集的數據不斷增加,查詢時間變得越來越慢。我現在已經獲得了大約30萬條記錄,並且每個查詢都需要2秒鐘。我們希望在達到約2百萬條記錄時開始修剪數據,但考慮到我們目前面臨的性能問題,我認爲這是不可能的。我想知道是否有更好的方法來解決我如何做到這一點。
這裏是血淋淋的細節...
我有一個包含用戶ID,課程號和時間戳一個簡單的三列InnoDB表。用戶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查詢會生成我正在查找的數據。我對如何更快地做到這一點提出了一些想法。我會很感激任何有關該方法的反饋意見。
您可以發佈查詢的「解釋」嗎? – m4573r 2013-03-07 21:55:50
爲了完整起見,以下是我的[原始查詢](http://oi49.tinypic.com/k9dh7t.jpg)和m4573r的[建議查詢](http://oi46.tinypic.com/)的解釋結果。 2m85u9l.jpg)。 – Brandon 2013-03-07 22:38:23