当我执行此查询时,它似乎导致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对表进行连接。
在不改变表结构的情况下,有更快/更好的方法吗?
答案 0 :(得分:2)
因为您的查询非常强大
40k x 25k x 3.5m
加入的行需要考虑。您是否已为加入时使用的所有列编制索引?
http://www.wolframalpha.com/input/?i=40000+x+25000+x+3500000
这是一个很多的数据。
答案 1 :(得分:0)
你的问题是自我回答的。加入如此大的桌子是重型装载机。