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

标签 mysql

当我执行这个查询时,它似乎导致 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/

相关文章:

c# - c# asp.net 程序执行过程中遇到 fatal error

Python:使用请求读取图像(url),然后将其作为BLOB数据保存到MySQL

mysql - 如何将root密码更改为空密码?

mysql - 在 MySQL 中选择 TIMESTAMP 而不是 DATETIME 列的充分理由是什么?

mysql查找子组最大值的总和

php - 帮助使用 Php/Mysql 表单从数据库中删除书籍

mysql - 选择特朗普今日记录.time()

mysql - 使用生成大量计算统计信息的 MariaDB View - 如何移动到计算表?

mysql - 将多个值插入同一列

mysql - 修改列的最简单方法?