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 = 1\on  关闭 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条数据记录。

一个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;
 
查询表中第31至第40条记录,id作为主键可能不是连续增长的列
3、select top 10 * from a  where id >(select max(id) from (select top 30 id from a order by a ) T) order by a
 
 
 mysql的分区 横向分区 纵向分区
1,mysql5.1及以上支持分区功能
     show variables like "%part%"; 
     range分区    list分区   hash分区   key分区  子分区
详细参考:https://blog.csdn.net/yongchao940/article/details/55266603
 
 
 

 

posted on 2018-04-06 22:48  备备  阅读(191)  评论(0编辑  收藏  举报