繁体   English   中英

MySQL简单选择查询很慢

[英]MySQL simple select query is slow

我有大约110.000.000项的大型mysql表

表设计为:

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秒),但我不知道是否仅是因为表中的项目数量。 您有提示如何加快查询速度或查表吗?

拥有1亿1千万条记录,我无法想象有很多条目的曲目ID有问题。 我会有诸如

(trackID1, sim )
(trackID2, sim )
(tracksimID, sim)

并通过联合进行PREQUERY并加入该结果

select STRAIGHT_JOIN
      TS2.*
   from
      ( select ts.tracksimID
           from tracksim ts
           where ts.trackID1 = 168123
             and ts.sim > 0.5
        UNION
        select ts.trackSimID
           from tracksim ts
           where ts.trackid2 = 168123
             and ts.sim > 0.5 
      ) PreQuery
      JOIN TrackSim TS2
         on PreQuery.TrackSimID = TS2.TrackSimID
   order by
      TS2.SIM DESC
   LIMIT 0, 100

我通常都同意Drap,但是以下查询变体可能更加有效,尤其是对于更大的LIMIT:

SELECT TS2.*
FROM (
  SELECT tracksimID, sim
  FROM tracksim
  WHERE trackID1 = 168123
    AND sim > 0.5
  UNION
  SELECT trackSimID, sim
  FROM tracksim
  WHERE trackid2 = 168123
    AND ts.sim > 0.5
  ORDER BY sim DESC
  LIMIT 0, 100
) as PreQuery
JOIN TrackSim TS2 USING (TrackSimID);

需要(trackID1, sim)(trackID2, sim)索引。

尝试过滤查询,以免不返回完整表。 另外,您可以尝试将索引应用于其中一个轨道ID的表,例如:

CREATE INDEX TRACK_INDEX
ON tracksim (trackID1)

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

http://www.tutorialspoint.com/mysql/mysql-indexes.htm

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM