2012-08-27 37 views
2

我有以下结构表:的MySQL查询使用DISTINCT和GROUP BY后很慢?

-- Table structure for table `temp_app` 
-- 

CREATE TABLE IF NOT EXISTS `temp_app` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `vid` int(5) NOT NULL, 
    `num` varchar(64) NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    KEY `vid` (`vid`), 
    KEY `num` (`num`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=69509; 

-- Table structure for table `inv_flags` 
-- 

CREATE TABLE IF NOT EXISTS `inv_flags` (
    `num` varchar(64) NOT NULL, 
    `vid` int(11) NOT NULL, 
    `f_special` tinyint(1) NOT NULL, /*0 or 1*/ 
    `f_inserted` tinyint(1) NOT NULL, /*0 or 1*/ 
    `f_notinserted` tinyint(1) NOT NULL, /*0 or 1*/ 
    `userID` int(11) NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    KEY `num` (`num`), 
    KEY `userID` (`userID`), 
    KEY `vid` (`vid`), 
    KEY `timestamp` (`timestamp`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

以下查询的执行时间为9秒,以显示30个记录。哪里不对?

SELECT date_format(ifs.`timestamp`,'%y/%m/%d') as `date` 
       ,count(DISTINCT ta.num) as inserted /*Unique nums*/ 
       ,SUM(ifs.f_notinserted) as not_inserted 
       ,SUM(ifs.f_special) as special 
       ,count(ta.num) as links /*All nums*/ 
       from inventory_flags ifs 
       LEFT JOIN temp_app ta ON ta.num = ifs.num AND ta.vid = ifs.vid 
       WHERE ifs.userID = 3 
       GROUP BY date(ifs.`timestamp`) DESC LIMIT 30 

EXPLAIN RESULT

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE ifs ref userID userID 4 const 12153 Using where 
1 SIMPLE ta ref vid,num num 194 ifs.num 1 

回答

1

COUNT DISTINCT有时可引起与MySQL烂性能。试试这个:

select count(*) from (select distinct... 

因为它有时会阻止MySql将整个临时结果写入磁盘。

下面是MySQL数据库的错误信息:

http://bugs.mysql.com/bug.php?id=21849

+0

注:强调 “有时” ... –