MySQL为JOIN和GROUP BY使用单独的索引

时间:2016-02-04 18:06:18

标签: mysql sql performance

我正在尝试执行以下查询

SELECT
   a.sessionID         AS `sessionID`,
   firstSeen, birthday, gender,
   isAnonymous, LanguageCode
FROM transactions AS trx
INNER JOIN actions AS a ON a.sessionID = trx.SessionID
WHERE a.ActionType = 'PURCHASE'
GROUP BY trx.TransactionNumber

Explain提供以下输出

1   SIMPLE  trx ALL TransactionNumber,SessionID NULL    NULL    NULL    225036  Using temporary; Using filesort
1   SIMPLE  a   ref sessionID   sessionID   98  infinitiExport.trx.SessionID    1   Using index

问题在于我正在尝试使用一个字段进行连接,并为GROUP BY使用不同的字段。

如何告诉MySQL对同一个表使用不同的索引?

CREATE TABLE `transactions` (
  `SessionID` varchar(32) NOT NULL DEFAULT '',
  `date` datetime DEFAULT NULL,
  `TransactionNumber` varchar(32) NOT NULL DEFAULT '',
  `CustomerECommerceTrackID` int(11) DEFAULT NULL,
  `SKU` varchar(45) DEFAULT NULL,
  `AmountPaid` double DEFAULT NULL,
  `Currency` varchar(10) DEFAULT NULL,
  `Quantity` int(11) DEFAULT NULL,
  `Name` tinytext NOT NULL,
  `Category` varchar(45) NOT NULL DEFAULT '',
  `customerInfoXML` text,
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  KEY `TransactionNumber` (`TransactionNumber`),
  KEY `SessionID` (`SessionID`)
) ENGINE=InnoDB AUTO_INCREMENT=212007 DEFAULT CHARSET=utf8;

CREATE TABLE `actions` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sessionActionDate` datetime DEFAULT NULL,
  `actionURL` varchar(255) DEFAULT NULL,
  `sessionID` varchar(32) NOT NULL DEFAULT '',
  `ActionType` varchar(64) DEFAULT NULL,
  `CustomerID` int(11) DEFAULT NULL,
  `IPAddressID` int(11) DEFAULT NULL,
  `CustomerDeviceID` int(11) DEFAULT NULL,
  `customerInfoXML` text,
  PRIMARY KEY (`id`),
  KEY `ActionType` (`ActionType`),
  KEY `CustomerDeviceID` (`CustomerDeviceID`),
  KEY `sessionID` (`sessionID`)
) ENGINE=InnoDB AUTO_INCREMENT=15042833 DEFAULT CHARSET=utf8;

由于

编辑1 :我的索引被破坏了,我不得不在事务表中添加(SessionID,TransactionNumber)索引,但是现在,当我尝试包含trx.customerInfoXML表时mysql停止使用索引

编辑2 Another answer并没有真正解决我的问题,因为它不是标准的sql语法,并且强制索引通常不是一个好主意。 对于ORM用户来说,这种语法是无法实现的奢侈品。

编辑3 我更新了索引并解决了问题,请参阅编辑1

0 个答案:

没有答案