当我执行这个查询时,它似乎导致 mysqld.exe 进程使用了我 50-100% 的 cpu。
任何想法为什么。
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/weekly 都是
代码 |成员(member)编号
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 是 编号 |飞买 |布拉 |布拉 |啦啦啦
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 对表进行连接。
有没有更快/更好的方法在不改变表结构的情况下做到这一点?
最佳答案
因为你的查询非常强大
40k x 25k x 3.5m
需要考虑连接的行。您是否对联接中使用的所有列编制了索引?
http://www.wolframalpha.com/input/?i=40000+x+25000+x+3500000
那是很多数据。
关于mysql - 什么会导致此查询使用 50% 的 CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410680/