我有以下(简化的)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'
任何建议/指导都赞赏!
答案 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表中索引中前导列的选择取决于预期的基数。)