我有一個大的MySQL表有關項目110.000.000MySQL的簡單選擇查詢速度慢
表的設計是:
CREATE TABLE IF NOT EXISTS `tracksim` (
`tracksimID` int(11) NOT NULL AUTO_INCREMENT,
`trackID1` int(11) NOT NULL,
`trackID2` int(11) NOT NULL,
`sim` double NOT NULL,
PRIMARY KEY (`tracksimID`),
UNIQUE KEY `TrackID1` (`trackID1`,`trackID2`),
KEY `sim` (`sim`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
現在我想查詢一個正常的查詢:
SELECT trackID1, trackID2 FROM `tracksim`
WHERE sim > 0.5 AND
(`trackID1` = 168123 OR `trackID2`= 168123)
ORDER BY sim DESC LIMIT 0,100
EXPLAIN語句給我:
+----+-------------+----------+-------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+-------+---------------+------+---------+------+----------+----------+-------------+
| 1 | SIMPLE | tracksim | range | TrackID1,sim | sim | 8 | NULL | 19980582 | 100.00 | Using where |
+----+-------------+----------+-------+---------------+------+---------+------+----------+----------+-------------+
查詢似乎很慢(約185秒),但我不知道它是否僅僅是因爲表中的項目數量。竇你有一個提示,我可以如何加快查詢或表查找?
感謝
你會得到多少火柴?我懷疑這是花費最多時間的'ORDER BY SIM DESC'。 – RedFilter 2012-03-29 14:23:12
那麼,表格的目的是什麼?以及'sim','track1'和'track2'是什麼?如果沒有這個,沒有人可以分辨出餐桌設計是否有效...... – Piskvor 2012-03-29 14:25:40
該表的目的是保存關於不同軌道相似性的信息。在我的情況下,我有大約200萬首歌曲(這裏我使用了一個子集)並計算相似度分數。這個分數的範圍從-1到+1,而我只保存那些大於0的分數。爲了不保存NxN項目,我只保存NxN/2軌道,因爲它是雙向的。在我的情況下,trackID2總是比trackID1小。爲了計算下一步我需要類似曲目的top-k。 – simon 2012-03-29 14:30:19