线上 mysql cpu100%怎么排查(待亲自试验)
登录mysql之后,可以用show full processlist 用来查看当前线程处理情况。这里面会列出当前执行的sql的运行时长等情况。
select * from table t where size > 10 group by size order by size的sql语句执行顺序?
Mysql的执行顺序是如下
-
FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
-
ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
-
JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
-
WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
-
GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
-
CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
-
HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
-
SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
-
DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
-
ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
-
LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。
因此执行顺序将是 from table t
> where size > 10
> group by size
> order by size
数据库的第一范式,第二范式,第三范式
- 第一范式就是数据库中的每一列都是不可分割的基本数据项,同一列中不能有多个值
- 第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式,第二范式要求数据库的每个实例或行必须可以被唯一的区分
- 第三范式要求一个数据库表中不包含已在其他表中已包含的非主关键字信息
当一个并发量很高的系统,数据量也很大,需要给A表增加一个字段,怎么办?
- 第一种:
1,需要创建一个字段和A表一样的,并且增加这个新字段的B表。
2,给A表设置一个触发器,然后将A表中的数据全部复制到B表中,并且触发器的条件设置成更新表数据的时候同步更新到B表。
3,当复制完成后,给A表加上表锁,然后修改B表的名称为A表,同时删除之前的A表。
- 第二种:
使用工具pt-online-schema-change
例如:
perl E:\cleaning\pt-online-schema-change h=127.0.0.1,p=root,u=root,D=mysqldemo,t=test_numberic --alter "modify c4 varchar(15) not null default '' " --execute
varchar和char区别
varchar是可变字符类型,char是不可变。char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)
varchar(50) 指的是最多存50个字符,例如50个汉字或者50个英文。varchar(50)和200,存储时所占空间一样,但是200排序会更费时。
int(20)是指显示字符的长度,即只能插入20个数字,20表示数字宽度,仍然占四个字节存储,存储范围不变。
快照读
快照读是一种一致性不加锁的读,读取的是回滚段里的数据(即旧版本数据),这里的数据不会修改,可以随便并发读。这是innodb高并发的核心原因之一。普通的select语句都是快照读,除非显示地加锁。多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。
先插入主键为1、2、3的数据,再删除2、3,重启mysql,再插入一条新数据,从几开始。
跟存储引擎有关,如果是myisam,由于会存储最大自增主键,所以从4开始,innodb最大记录存在内存中,所以会从
sql去重方法
-
distinct
如果仅仅指定一个字段去重则会麻烦,效率低
-
group by
MySQL和oracle where执行顺序
-
MySQL是从左往右
-
Oracle是从右往左。过滤最大的条件放在右侧,而且也会有短路
On和Where区别
-
on是在生成临时表时使用的条件,left join 的时候左侧数据都会返回
-
where是临时表生成之后,再对临时表进行过滤。
-
having速度是最慢的
union 和union all
union会列出去重之后的所有值,union all 会列出所有