• Mysql小知识随记


    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条数据记录。

    一个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
     
     
     
  • 相关阅读:
    在 centos 下禁止 root 通过 ssh 远程登录
    在 sql server 中开启审核日志
    设置 centos 系统,使用终端连接的空闲等待时间(超时断开)
    谷歌地图文字渲染原理
    WebGL 水波及焦散(刻蚀)的渲染总结
    【Mybatis】获取sql
    git如何查看最新的远程分支
    绑定点击事件,当点击事件里依赖异步返回结果则阻止冒泡失效
    一个非常好用的生成目录树的npm包
    Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!
  • 原文地址:https://www.cnblogs.com/yuki-l/p/8729279.html
Copyright © 2020-2023  润新知