MySQL性能和Memcache

时间:2014-11-21 02:39:01

标签: mysql jpa memcached eclipselink

我有以下(简化的)Mysql表:

Requests:
    +----------------------+--------------+------+-----+---------+-------+
    | Field                | Type         | Null | Key | Default | Extra |
    +----------------------+--------------+------+-----+---------+-------+
    | ID                   | bigint(20)   | NO   | PRI | NULL    |       |
    | UniqueIdentifier     | varchar(255) | YES  | MUL | NULL    |       |
    | UniversalServiceId   | bigint(20)   | YES  | MUL | NULL    |       |
    +----------------------+--------------+------+-----+---------+-------+

观察:

+---------------------+--------------+------+-----+---------+-------+
| Field               | Type         | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| ID                  | bigint(20)   | NO   | PRI | NULL    |       |
| Value               | varchar(255) | NO   |     | NULL    |       |
| RequestId           | bigint(20)   | NO   | MUL | NULL    |       |
+---------------------+--------------+------+-----+---------+-------+

我已将UniqueIdentifier,UniversalServiceId和RequestId编入索引。

在UniqueIdentifier和UniversalServiceId上查询表,并在RequestId上使用JOIN。

观察表有数百万条记录。返回的查询非常缓慢,我想知道是否有任何可以提高性能的方法。我刚刚开始阅读关于memcache的内容,但它似乎只有在特定数据集的第一个查询(通常是唯一的查询)之后才有用。

这是他们正在使用的查询类型:

select * from Observations where RequestId in (select ID from Requests where UniqueIdentifier = '123456' and UniversalServiceId = '1234'

任何建议/指导都赞赏!

1 个答案:

答案 0 :(得分:1)

我建议您使用JOIN操作而不是IN (subquery)谓词来使用查询。

例如:

SELECT o.ID
     , o.Value
     , o.RequestId
  FROM Observations o
  JOIN Requests r
    ON r.ID = o.RequestId
 WHERE r.UniqueIdentifier = '123456' 
   AND r.UniversalServiceId = '1234'

为获得最佳性能,合适的索引将是:

... ON Requests (UniversalServiceId, UniqueIdentifier, ID)
... ON Observations (RequestId, Value, ID)

(Requests表中索引中前导列的选择取决于预期的基数。)