关于mysql不得不说的一些事情

基于mysql8.0.2

A.mysql常用命令

  1. 查询版本
    mysql -v 客户端未连接
    select version();\sstatus; 客户端已连接
  2. 查询隔离级别
    show variables like '%isolation%'; 通用方法
    select @@transaction_isolation; v8.0.2
    select @@tx_isolation; 老一点的版本,具体不清楚啊,略惆怅
  3. 修改隔离级别
    SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL { REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE }
  4. 查询当前数据库:SELECT database();
  5. 查询所有数据库:show databases;
  6. 使用数据库a: use a;
  7. 开启一个事务:START TRANSACTION WITH CONSISTENT SNAPSHOT;begin;
  8. 查询当前会话是否自动提交:select @@autocommit;show variables like 'autocommitt;'
  9. 设置自动提交状态:set autocommit=[0,1];,0:不自动;1:自动
  10. 新增列:alter table xxxx add column c_name c_type c_default;

B.mysql配置解析

C.mysql知识点解析

1.count(*)工作原理

对于innodb,它是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。对于 count(*) 这样的操作,MySQL 优化器会找到最小的那棵树来遍历。

不记录表数据行数的原因:innodb的事务设计是通过多版本并发控制(MVCC)来实现的;每一行都需要判断自己是否对会话可见,因此需要一条一条的去读出判断

show table status命令查询,结果中有字段 TABLE_ROWS 来显示表当前行数。该命令查询很快,但注意:该值为采样估算值,不可直接使用;官方误差可能达到40%到50%

几种计数效率:count(字段)<count(主键 id)<count(1)≈count()
count()专门做了优化,并不会把全部字段取出来,count(*) 肯定不是 null,按行累加。
count(字段)需要对字段进行非空判断,不为空才累加;
count(1)不需要对数据进行解析,按行累加;

count(*)是一个耗时操作,获取计数的解决方案:

  1. 缓存系统计数:通过缓存来对数据的增减进行计数,缺点: 可能导致计数误差;— 多系统协调的弊端,当然在正常情况下,可以保证最终一致性;
  2. 数据库保存计数:建立专门的统计表通过事务来保证一致性;也可以通过触发器来完成该动作;

2.Order by工作原理

order by 分为 全字段排序rowId排序

  1. 全字段排序
    会根据排序字段的索引,获取到要查询的字段,然后放入sort buffer中进行排序;当数据量较大时(由参数 sort_buffer_size 控制)会通过临时文件拆分的方式(分治,归并)来进行排序;
    在索引建立时,可以联合查询字段进行索引创建,可以减少回表;同时可能让符合条件的数据本身即为有序的,则不需要排序;这极大地提升了性能;
-- 示例:
-- 索引 index(city, name, age),天然有序
select city,name,age from t where city='杭州' order by name limit 1000  ;
  1. rowId排序
    排序行数据长度 > max_length_for_sort_data 时,采用 排序字段 + id 的方式放入sort buffer排序;再通过回表的方式将最终结果返回客户端;
  • 确认是否使用临时文件:
/* 打开optimizer_trace,只对本线程有效 */
SET optimizer_trace='enabled=on'; 

/* @a保存Innodb_rows_read的初始值 */
select VARIABLE_VALUE into @a from  performance_schema.session_status where variable_name = 'Innodb_rows_read';

/* 执行语句 */
select city, name,age from t where city='杭州' order by name limit 1000; 

/* 查看 OPTIMIZER_TRACE 输出 */
SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G
-- number_of_tmp_files 表示的是,排序过程中使用的临时文件数
-- examined_rows 表示参与排序的行数
-- sort_mode > packed_additional_fields 在排序过程中还是要按照实际长度来分配空间的。

/* @b保存Innodb_rows_read的当前值 */
select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name = 'Innodb_rows_read';

/* 计算Innodb_rows_read差值:表示整个执行过程扫描行数, innodb值会比实际值多1 */
select @b-@a;

D.mysql问题汇总

1.解析语句:insert into tableA (A, B, C) values (B, A, 2) on duplicate key update C=C | 2;

insert … on duplicate 语句,确保了在事务内部,执行了这个 SQL 语句后,就强行占住了这个行锁,
确保了之后的操作是在行锁保护下的读操作。
当有两个事务同时插入时,保证当前事务的值为俩事务的按位或值

2.为什么varchar字段长度常设置成功255

官方概念:VARCHAR类型的值存储格式为1到2个字节的长度前缀加上数据内容。长度前缀表示数据内容的字节数。当数据所需最大长度不超过255字节时,长度前缀为1个字节,当数据所需最大长度超过255个字节时,长度前缀为2个字节。
原因:我们知道 1byte = 8bit;刚好够用来表示[0, 255],因此长度超过255时,需要多一个字节来表示长度;为了节省空间,常设置长度为不大于255的值;

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值