利用我的JOIN语句使用MySQL多列索引

时间:2014-03-12 00:42:23

标签: mysql

加入时我在使用MySQL多列索引时遇到了一些麻烦。也许是一个新手问题,但我很感激帮助。

我在“type”,“status”和“timeSent”列的通知表上有一个多列索引。

运行此查询:

SELECT count(notificationID) FROM notification
WHERE statusID = 2
AND typeID = 1
AND timeSent BETWEEN "2014-01-01" AND "2014-02-01"

这使用我的3列索引并快速运行。如果我想获取特定客户端的通知,我需要加入我的用户表。

SELECT COUNT(a.notificationID) FROM notification a
  LEFT JOIN user b ON a.userID = b.userID
 WHERE a.statusID = 2
   AND a.typeID = 1
   AND b.clientID = 1
   AND a.timeSent BETWEEN "2014-01-01" AND "2014-02-01"

此查询一起忽略我的索引,并且因为通知表中有15m记录而尖叫停止。我尝试使用相同的结果进行子选择。

非常感谢任何输入。

1 个答案:

答案 0 :(得分:0)

您的通知表非常大,因此尝试添加索引并不便宜。但无论如何我会建议。

首先,众所周知,COUNT(*)COUNT(someColumn)更快。我认为您可以在不改变查询含义的情况下进行更改。

其次,您的(typeID, statusID, timeSent)覆盖索引非常适合您的第一次查询。 MySQL可以随机访问索引到第一个日期,顺序扫描到第二个日期,只计算索引条目,从而满足您的查询。

第三,让我们看一下clientId-finding查询。它实际上做的是查找statusIDtypeIDuserID的特定,单一值的通知的日期范围。您明确指定前两个,并且查询从连接表中提取第三个。因此,(userID, typeID, statusID, timeSent)上的另一个覆盖索引可能很适合你。