什么会导致此查询使用50%的CPU?

时间:2010-08-04 23:33:17

标签: mysql

当我执行此查询时,它似乎导致mysqld.exe进程使用我的cpu的50-100%。

任何想法为什么。

SELECT m.draw_id , m.mobile, m.fly_buys, m.signup_date,
  IF(m.club = 1, 'Yes', 'No') AS club,
  IF(w.code != '', w.code, 
     IF(f.code != '', f.code, 
        IF(t.code != '', t.code, 'Unknown') ) ) AS code,
  IF(w.code != '', 'General', 
     IF(f.code != '', '5 pt', 
        IF(t.code != '', '10 pt', 'Unknown') ) ) AS code_type
  FROM action_6_members m
  LEFT JOIN action_6_5pts f ON f.member_id = m.id
  LEFT JOIN action_6_10pts t ON t.member_id = m.id
  LEFT JOIN action_6_weekly w ON w.member_id = m.id
  WHERE `draw_id` = '3' ORDER BY m.id DESC limit 0, 20;

注意:这不会返回大量数据(10行) 注意:虽然返回的行数只有10行        action_6_5pts包含40k行
       action_6_10_pts包含25k行
       action_6_weekly包含350万行。

<小时/>的更新
所以我添加了一个索引,现在效果更好。

这是基本的表格示意图。

action_6_5pts / 10pts /每周都是

代码| member_id

CREATE TABLE `action_6_5pts` (
  `code` varchar(255) NOT NULL,
  `member_id` int(11) NOT NULL,
  PRIMARY KEY (`code`),
  KEY `member_id` (`member_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

action_6_members是 id | flybuys | bla | bla | BLA

CREATE TABLE `action_6_members` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `draw_id` int(11) NOT NULL,
  `mobile` varchar(255) NOT NULL,
  `fly_buys` varchar(255) NOT NULL,
  `signup_date` datetime NOT NULL,
  `club` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1

所以,

我需要返回成员的代码类型和实际代码。

此信息不存储在任何地方,我能看到的唯一方法是根据每个用户的member_id对表进行连接。

在不改变表结构的情况下,有更快/更好的方法吗?

2 个答案:

答案 0 :(得分:2)

因为您的查询非常强大

40k x 25k x 3.5m

加入的行需要考虑。您是否已为加入时使用的所有列编制索引?

http://www.wolframalpha.com/input/?i=40000+x+25000+x+3500000

这是一个很多的数据。

答案 1 :(得分:0)

你的问题是自我回答的。加入如此大的桌子是重型装载机。