我有一个大的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