1、MySQL 4.1之前的版本,VARCHAR(50)的“50”指的是50字节(bytes)。如果存放UTF8汉字时,那么最多只能存放16个(每个汉字3字节)。从MySQL 4.1版本开始,VARCHAR(50)的“50”指的是50字符(character),无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。
MySQL binlog的几种日志录入格式以及区别
binlog的日志格式的种类和分别:日志有三种格式,分别为Statement,MiXED,以及ROW!
适用场景:
Mysql默认是使用Statement日志格式,推荐使用MIXED.
由于一些特殊使用,可以考虑使用ROWED,如自己通过binlog日志来同步数据的修改,这样会节省很多相关操作。对于binlog数据处理会变得非常轻松,相对mixed,解析也会很轻松(当然前提是增加的日志量所带来的IO开销在容忍的范围内即可)。
mysql对于日志格式的选定原则:如果是采用 INSERT,UPDATE,DELETE 等直接操作表的情况,则日志格式根据 binlog_format 的设定而记录,如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何 都采用 SBR 模式记录。
mysql数据库cpu飙升到500%的话他怎么处理?
(1)多实例的服务器,先top查看是那一个进程,哪个端口占用CPU多;
(2)show processeslist查看是否由于大量并发,锁引起的负载问题;
(3)否则,查看慢查询,找出执行时间长的sql;explain分析sql是否走索引,sql优化;
(4)再查看是否缓存失效引起,需要查看buffer命中率;
explain出来的各种item的意义;
- id select识别符。这是select的查询序列号--id相同,实行顺序由上至下,id不同,如果是子查询,id序号会递增,id越大优先级越高
- select_type 查询的类型 普通查询、联合查询、子查询等 SIMPLE、PRIMARY(最外层)、SUBQUERY、DERIVER(衍生)、UNION、UNION RESULT
- table 显示这一行的数据是关于哪张表的
- type 访问类型排列,从好到次(常见) system>const>eq_ref>ref>range>index>ALL
- partitions(这一列只有在EXPLAIN PARTITIONS语法中才会出现)
- possible_keys 显示可能应用在这张表的索引,查询涉及的字段上若存在索引会被列车,但不一定实际用到
- key 实际使用的索引,(查询中若使用了覆盖索引,则该索引仅出现在key列表中)
- key_len 表示索引中使用的字节数,索引字段的最大可能长度,并非实际使用长度,跟据表定义技术而得,(不损失精确性下,长度越短越好)
- ref 显示索引被哪一列使用了,如果可能的话是一个常数。
- rows 根据表统计信息及索引选用情况,大致估算出找到所需记录所需要的读取行数
- filtered(这一列只有在EXPLAINED EXTENDED语法中才会出现)
- Extra 格外信息 Using filesort:mysql对数据使用一个外部索引排序不是按照表内索引,mysql无法利用索引完成排序称为“文件排序”出现它不是好事
- Using temporay 使用了临时表,常见于排序order by 和分组查询group by
- Using index 表示相应的select操作使用了覆盖索引,如果同时出现using where 表明索引被用来执行索引键值查找,如无仅表读取
- Using where 使用了where过滤
- Using join buff 使用了链接缓存
profile的意义以及使用场景
是什么:是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用来sql调优的测量 (默认未开启)
步骤:1.查看是否开启 show variable like 'profiling'
2.开启 set profiling = 1on 关闭 set profiling = off
3.执行sql
4.分析sql ,show prolifiles
show profile for query 1; --1是query_id
show profile cpu for query 1;
show profile memory for query 1;
show profile block io,cpu for query 1; (常用)
| Status | Duration | CPU_user | CPU_system | Block_ops_in |
status 表示不好的情况:
converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上般了
Creating tem table 创建临时表
Copying to tmp table on disk 把内存中临时表复制到磁盘 ,危险!!
cocked
慢查询日志
是mysql 提供的一种日志记录,它用来记录mysql中响应时间超过阀fa值的语句,指超long_query_time 值的sql,会被记录到慢日志中
默认值为10秒,未开启
开启:show variable like '%slow_query_log%' -->set global slow_query_log = 1;
使用命令对当前数据库有效,重启失效
MySQL提供了mysqldumpslow工具分析日志
mysqldumpslow -s r -t 10 /var/lib/mysql/xxx.log 得到返回记录最多的10个sql
mysqldumpslow -s c -t 10 ...log 得到访问次数最多的10个sql
mysqldumpslow -s t - t 10 -g "left join" ....log 得到按时间排序的前10条里面含左连接的查询语句
如何让数据库支持emoji表符存储
mysql数据库的默认字符集utf8,只能存储3个字节的数据。标准的emoji表情是4个字节,在APP端输入保存表情是用户的普遍需求和行为。
解决方式:更换字符集utf8-->utf8mb4 mb4的意思是most bytes 4,专门为兼容四个字节的。utf8mb4是向下兼容utf8的,所以即便修改了字段的字符集也不会影响线上数据。
前提:mysql大于5.5.3版本。
表中表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,放在字表还是继续放一起
(1) 您 是选择拆成子表,还是继续放一起?
a) 放在子表中
(2) 理由?
a) 避免大数据被频繁的从buffer重换进换出,影响其他数据的缓存;
sql 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。
1、如果A表TID是自增长,并且是连续的,B表的ID为索引
select * from a,b where a.tid = b.id and a.tid>500000 limit 200;
2、如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。
select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;