# ### part1 索引树高度

# 1.表的数据量
数据量越大,树的高度就会变高,理论上三层索引树的高度最为理想,可以支持百万级别的数据量
解决:可以使用分表(横切,竖切),分库,增加缓存,解决数据量大,查询慢 # 2.索引键值过长
该索引字段存储数据太大,每个叶子节点最大存储16k,超过这个范围会新增加叶子节点和分支节点
解决:前缀索引(截取前5个长度) # 3.数据类型
char(定长) varchar(不定长) 从开辟空间速度来看,char快
从数据结构上来看,varchar更为合理
(1) 避免使用select *,不确定表大小的时候,使用count(*)查一下数据
(2) 尽量使用数据类型较小的字段作索引
(3) 重复值少的,区分度高的字段索引,性别这样的字段不要做索引
(4) 在多表查询时使用join,尽量少的使用子查询 # ###part2 执行计划分析
'''desc/explain'''
# 执行计划:在一条sql执行之前,制定执行的方案
desc select * from s1;
#1.select type
simple 代表的是简单查询(单表查询,不包括子查询,union)
primary sql嵌套中的主查询(外层)
subquery sql嵌套中的子查询(里面)
derived 衍生查询(把子查询结果作为一张临时表) #2.table
在多表或者子查询时候,通过table分析出问题的表是谁 #3.type
#显示执行计划的类型,优先级从低到高,优化时,至少达到range或者ref级别
all < index <range <ref <eq_ref <const <system
#1.all全表扫描(不走索引)
(1)在大范围内查询 > < >= <= != between and in like ...
(2)where条件中与计算,有函数
(3)数据类型不匹配
(4)拼接条件使用or #2.index 全索引扫描
'''扫描整个索引树,才能获取到所有数据,这样的索引失去意义'''
desc select count(*) from s1; #3.range 索引范围扫描(注意点:范围太大,不能命中索引)
desc select * from s1 where id <10; #type=range
desc select * from s1 where id <1000000; #type=all
desc select * from s1 where id between 1 and 10; #type= range
desc select * from s1 where id between 1 and 1000000;##type=all
desc select * from s1 where email like "%w%"; #type=all
desc select * from s1 where email like "w%"; #type=range(去掉左边%)
'''如果范围过大不能命中索引,如果范围适当,可以命中索引''' #对应in或者or这样的语句进行优化
select * from s1 where id in (1,2,3);
'''优化:union all 比 union速度快,union在合并数据之后,多一步去重操作'''
desc select * from s1 where id = 1
union all
select * from s1 where id = 1; #type = ref desc select * from s1 where id = 1
union
select * from s1 where id = 1; #type =ref但是多了一个all去重 #优化or条件
desc select * from s1 where id = 10 or name= "aaa"; #type=all
desc select * from s1 where id = 10
union all
desc select * from s1 where name = "aaa"; #4.ref 普通索引查询(非唯一)
desc select * from s1 where email = 'xboyww10@oldboy';
desc select * from s1 where id = 10; #此时id设置是普通索引 #5.eq_ref 唯一索引(联表)字段条数要一样才会触发
'''要求:应用在多表联查中,被关联的字段需要主键或者唯一,表之间的关系为一对一,并且数据条数相同'''
desc select * from student1,class1 where student1.class_id = class1.id;
alter table class1 add primary key(id);
delete from student1 where id = 3; # 6.const:主键或者唯一索引(单表)
'''针对于primary key 和unique索引等值查询'''
desc select * from class1 where id = 1; #type=const
desc select * from class1 where id > 1; #type = range #7.system(了解)
'''只有一条数据的系统表''' #4.possible_keys : 执行sql时,可能用到的索引是谁
#5. key :执行sql时,使用用到的索引是谁
show index from s1;#展现s1表所有索引 #6.key_len:判断联合索引覆盖的长度 判断触发没有触发 看key_len
在没有not null 约束的时候,默认预留一个字节,标记是空或者非空
utf8 通过情况下.中文1个字符占用3个字节.字母占用1个字节,极个别的生僻字占用4个字节
varchar 每次存储数据的时候,系统底层默认会额外预留2个字节
not null(不为空) 没有not null(可为空)
tinyint 1 1+1
int 4 4+1
char(5) 5*3 5*3+1
varchar(5) 5*3+2 5*3+2+1 #把数据表中的数据导入
n1-> 5B n2-> 4B n3->16B 5+4+16 = 25
desc select * from t100 where n1 =2 and n2 =2 and n3 = "a";#命中n1 n2 n3
desc select * from t100 where n1 =1 and n2 =2 and n3 = "a";#如果有重复数据,不会触发联合索引
desc select * from t100 where n1 =1 and n2 =2 ;#如果有重复数据,不会触发联合索引
desc select * from t100 where n1 =2 and n2 =2;#触发 9
desc select * from t100 where n1 =2;#触发 5 命中n1
desc select * from t100 where n1 =2 and n3="a"; #命中n1,最左前缀原则
desc select * from t100 where n2 =2 and n3="a"; #符号最左前缀原则,在没有n1的情况下不能触发
#index(a,b,c) -> a,ab.abc 创建了三组索引,符合最左前缀原则,第一个字段必须存在才能触发 # ### part2 事务处理的四项特征 ACID
A:原子性:
同一个事务中执行多条sql语句,要么全部成功,要么直接回滚,作为一个完整的整体,不能再继续分割的最小个体
C:一致性:
a,i,d,都是为了保证数据的一致性才提出来的,比如约束,键在插入数据时,必须按照要求插入,保证规则上的一致性
上升到事务中,如果出现意外导致数据不统一,例如脏读,幻读,不可重读,最终要保证数据是一致的
上升到主从数据库,主数据库增删改,从数据库也要进行同步改变,保证数据的一致性
I:隔离性:
lock + isolation锁,来处理事务的隔离级别
一个事务和另外一个事务工作过程中彼此独立隔离
D:持久性:
把数据写到磁盘上,保证数据持久化存储不丢失. #隔离性:隔离级别
脏读:没提交的数据被读出来了
不可重读:前后多次读取,结果数据内容不一样(同一个会话里,在不修改的情况下,永远只看到同样一份数据)
幻读:前后多次读取,结果数据的总量不一样 事务处理增加隔离级别4中级别
RU:读未提交的 :脏读,不可重读,幻读 READ-UNCOMMITTED
RC:读已提交的 :防止脏读,会出现不可重读和幻读 READ-COMMITTED
RR:可重复读 :防止脏读,不可重读,可能会出现幻读 REPEATABLE-READ
SR:可串行化 :防止一切(但是会把异步并发的程序变成同步程序,不能并发,性能差)
#查询当前mysql的隔离级别,默认是RR
select @@tx_isolation;
#查询是否自动提交数据
select @@autocommit; #1是提交成功
#系统默认的隔离级别 RR
transaction_isolation= REPEATABLE-READ
#防止系统自动提交
autocommit = 0 #修改mysql配置文件
D:\MySQL5.7\mysql-5.7.25-winx64\my.ini
#更改隔离级别
transaction_isolation=READ-UNCOMMITTED
#重启mysql
net stop mysql
#在开启
net start mysql #1.脏读
先去调整设置,重复mysql,尝试在一个窗口里通过事务
更改一条数据,开启另外一个窗口尝试读取,会出现问题 #2.不可重复读
#窗口1
begin;
updata t1 set k1 ="abc" where id = 1;
select * from t1;
commit; #窗口2
select * from t1;#数据也跟着改了是不可重读 #3.幻读
#窗口1
begin;
insert into t1 values(4,"c",50);
select * from t1;
commit; #窗口2
select * from t1; #数据也跟着增加了是幻读 #4.通过二次提交commit,可以让多用户同步数据
commit; #5.事务应用的技术(了解)
(1) RR级别下,解决不可重读,使用的是MVCC技术,生成最新的mysql系统备份(快照),然后读取快照
(2)RR级别下,解决幻读,gap 间隙锁, next-lock下一键锁

mysql进阶优化2---day41的更多相关文章

  1. (6)MySQL进阶篇SQL优化(MyISAM表锁)

    1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...

  2. (2)MySQL进阶篇SQL优化(show status、explain分析)

    1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...

  3. (4)MySQL进阶篇SQL优化(常用SQL的优化)

    1.概述 前面我们介绍了MySQL中怎么样通过索引来优化查询.日常开发中,除了使用查询外,我们还会使用一些其他的常用SQL,比如 INSERT.GROUP BY等.对于这些SQL语句,我们该怎么样进行 ...

  4. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  5. 【目录】mysql 进阶篇系列

    随笔分类 - mysql 进阶篇系列 mysql 开发进阶篇系列 55 权限与安全(安全事项 ) 摘要: 一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysq ...

  6. MySQL进阶篇(02):索引体系划分,B-Tree结构说明

    本文源码:GitHub·点这里 || GitEE·点这里 一.索引简介 1.基本概念 首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储.组织数据的方式,是指相互之间存在一种或多种特定关系 ...

  7. MySQL进阶篇(03):合理的使用索引结构和查询

    本文源码:GitHub·点这里 || GitEE·点这里 一.高性能索引 1.查询性能问题 在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量的 ...

  8. MYSQL进阶学习笔记

    MySQL在Linux中的使用: 1.查看mysql在linux的安装版本 mysqladmin –version 2.mysql服务的启动与停止 (1).启动: service mysql star ...

  9. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  10. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

随机推荐

  1. [转帖]jumpserver 添加Windows主机

    jump server添加 Windows主机资产 添加Linux主机资产步骤我们可以参照 链接:jump server添加Linux主机资产 进行操作. 一.资产管理-资产列表-创建资产 IP根据自 ...

  2. 测试环境Nginx反向代理负载均衡模板说明

    公司里面为了验证 https 以及域名特点进行了相关的测试工作.  为了简单起见 将 安装文件执行了导出. 这样的话就比较简单了. 注意说明一点的是 我这边导出的工具都是 放到根目录下面 目录最简单. ...

  3. React中事件的绑定

    事件绑定 语法:on +事件名= { ()=>{ do something }} <!-- 点击事件 --> onClick={ () => { } } 注意的是:React采 ...

  4. 【发现一个问题】使用 fastcgo 导致额外的 `runtime._System` 调用的消耗

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了避免 cgo 调用浪费太多资源,因此使用了 fastc ...

  5. openAI发布v0.2.0了

    时隔20天,OpenAI从v0.0.1升级到了v0.2.0.与v0.0.1版相比,v0.2.0版主要做了以下改动: 把cmd目录下微信公众号的相关服务迁移到了这里 完善了cmd下的测试服务,针对ope ...

  6. Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能

    Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能 Milvus 是全球最快的向量数据库,在最新发布的 Milvus 2.2 benchmark中,Milvu ...

  7. 5.1 Windows驱动开发:判断驱动加载状态

    在驱动开发中我们有时需要得到驱动自身是否被加载成功的状态,这个功能看似没啥用实际上在某些特殊场景中还是需要的,如下代码实现了判断当前驱动是否加载成功,如果加载成功, 则输出该驱动的详细路径信息. 该功 ...

  8. 基于.NET的机械运动模拟应用开发

    1 简介 机械运动在物理学中,把一个物体相对于另一个物体位置的变化称作为机械运动,简称运动.机械运动是指一个物体相对于其他物体的位置发生改变,是自然界中最简单,最基本的运动形态. 自然界中一切物体都在 ...

  9. Typora Mac中文破解版获取

    作为程序员,markdown是非常好用的文本编辑语言,而Typora是非常好用的一款markdown编辑工具.Typora提供读者和作家的无缝体验.它删除了预览窗口,模式切换器,降低源代码的语法符号以 ...

  10. C#/.NET该如何自学入门?

    前言 随着DotNetGuide技术社区交流群的不断壮大(目前4个群都已经满500人,已开5群现已有180多个小伙伴),越来越多应届生和其他领域的小伙伴加入了我们这个大家庭.在此期间我在个人微信.公众 ...