简体   繁体   English

MySQL简单选择查询很慢

[英]MySQL simple select query is slow

I have a large mysql-table with about 110.000.000 items 我有大约110.000.000项的大型mysql表

The Table Design is: 表设计为:

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;

Now I want to query a normal query: 现在我要查询一个普通查询:

SELECT trackID1, trackID2 FROM `tracksim` 
WHERE sim > 0.5 AND 
      (`trackID1` = 168123 OR `trackID2`= 168123)
ORDER BY sim DESC LIMIT 0,100

The Explain statement gives me: 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 |
+----+-------------+----------+-------+---------------+------+---------+------+----------+----------+-------------+

The query seems to be very slow(about 185 seconds), but i don't know if it is only because of the amount of items in the table. 该查询似乎很慢(约185秒),但我不知道是否仅是因为表中的项目数量。 Do you have a tip how I can speedup the query or the table-lookup? 您有提示如何加快查询速度或查表吗?

With 110 million records, I can't imagine there are many entries with the track ID in question. 拥有1亿1千万条记录,我无法想象有很多条目的曲目ID有问题。 I would have indexes such as 我会有诸如

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

and do a PREQUERY via union and join against that result 并通过联合进行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

Mostly I agree with Drap, but the following variation of the query might be even more efficient, especially for larger LIMIT: 我通常都同意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);

Requires (trackID1, sim) and (trackID2, sim) indexes. 需要(trackID1, sim)(trackID2, sim)索引。

Try filtering your query so you don't return the full table. 尝试过滤查询,以免不返回完整表。 Alternatively you could try applying an index to the table on one of the track ID's, for example: 另外,您可以尝试将索引应用于其中一个轨道ID的表,例如:

CREATE INDEX TRACK_INDEX
ON tracksim (trackID1)

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

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

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

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