mysql相关知识

mysql执行计划


EXPLAIN 修饰可以查看执计划

EXPLAIN SELECT * from user

在这里插入图片描述
id
select_type 查询的类型
table 表名
partitions 是不是分区表
type 查询类型 ALL代表全盘扫描
possible_keys
key 到底有没有索引
key_len 索引的长度
ref 引用是啥
rows 行数
filtered 过滤的东西
Extra 额外的信息

优化级别:越在前的越好

system–>const–>eq_ref->ref–fulltext–>ref_or_null–>index_merage–>unique_subquery–>index_subquery–>range–>index–>All

索引


用途:提高查询效率
索引和实际的数据都是存储在磁盘的,只不过在进行数据读取的时候会优先把索引加载到内存中

聚簇索引和非聚簇索引

聚簇索引非聚簇索引
数据跟索引存储在一起的叫聚簇索引没有存储在一起的叫非聚簇索引

innodb存储引擎在进行数据插入的时候,数据必须跟某一个索引列存储在一起,这个索引可以没有主键,如果没有主键,选择唯一键,如果没有唯一键选择6字节的rowid来进行存储

数据必定是跟某一个索引绑定在一起的,绑定数据的索引叫聚簇索引。
其他索引的叶子节点中存储的数据不再是整行的记录,而是聚簇索引的id

innodb中既有聚簇索引也有非聚簇索引
myisam中只有非聚簇索引

B树

特点:n-1来插入数据
(节点没有重复)
在这里插入图片描述

B+树

一般情况下3-4层的b+树足以支撑千万级别的数据量存储。
(节点有重复)
在这里插入图片描述

回表

id,name,age,gender
id主键,name普通索引
select * from table where name=‘zhangshan’;
先根据nameB

索引覆盖

id,name,age,gender
id主键,name普通索引
select * from table where name=‘zhangshan’;
先根据name的值去nameB

最左匹配


创建索引的时候可以选择多个列来共同组成索引,此时叫做组合索引或者联合索引,要遵循最左匹配原则
id,name,age,gender
id主键,name,age组合索引

select * from table where name=‘zhangshan’ and age =12;会遵循
select * from table where name=‘zhangshan’ ;会遵循匹配了name
select * from table where age =12;不会遵循
select * from table where age =12 and name=‘zhangshan’ ;会遵循 数据库底层会反过来

索引下推


select * from table where name=‘zhangshan’ and age =12;
没有索引下推之前:先根据name从存储引擎中拉取数据到server层,然后在server层中对age进行数据过滤
有索引下推之后:根据name和age俩个条件来做数据筛选,将赛选之后的结构返还给server层
数据库默认是开启索引下推的

sql优化

  1. 查询SQL尽量不要使用select *,而是具体字段,节省资源
  2. 避免在where子句中使用or来连接条件,可能导致索引失效
  3. 使用varchar代替char
  4. 尽量使用数值替代字符串类型
  5. 查询尽量避免返回大量数据
  6. 使用explain分析你SQL执行计划
  7. 索引不宜太多,一般5个以内
  8. 避免在where子句中使用!=或<>操作符

事务


ACID实现原理
隔离级别

读未提交
读已提交
可重复度mysql默认级别
串行话

乐观锁
悲观锁
间隙所
行锁
表锁
记录锁
自增锁
意向锁
全局锁

全局锁
对整个数据库实例加锁,加锁后整个实例就处于只读状态后面的DDL、DML就会被阻塞。
典型的使用场景就是全库的逻辑备份,对所有的表进行锁定从而获取一致性试图,保证数据的完整性

flush tables whit read lock;//加全局锁
unlock tables;//释放锁

表级锁
每次操作锁住整张表。锁定力度大,发生锁冲突的概率高,并发读最低

分类

  • 表锁
    1.读锁 不会阻塞其他客户端的读会阻塞写
    2.写锁 既阻塞其他客户端的读又阻塞写
    语法:
    1.加锁:lock tables 表名…read/write
    2.释放锁:unlock tables /客户端断开连接
  • 元数据锁
    为了避免DML于DDL冲突,保证读写的正确性
  • 意向锁
    1.意向共享锁(IS):语句 select …lock in share mode添加。
    与表锁共享锁read兼容,于表锁排它锁write互斥。
    2.意向排他锁(IX):由insert、update、delete、select…for update添加。
    与表锁共享锁read级排它锁write都互斥,意向锁之间不会互斥。
    主要解决表锁和行锁冲突的问题
    行级锁
    每次操作锁住对应的行数据.锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在innoDB存储引擎中.。
    分类
    1.行锁(Record Lock):锁定单个行记录的锁,房租其他事物对此进行update和delect。在RC、RR隔离级别凑支持
    2.间隙锁(Gap lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事物在这个间隙进行insert,产生幻读。在RR隔离级别下支持。
    3.临键锁(Nest-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

InnoDB实现了以下俩种类型的行锁:
1.共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
2.排他锁(x):允许获取排他锁的事务更新数据,防止其他事务获得相同数据集的共享锁和排他锁。

增删改查,行锁做的一些操作
在这里插入图片描述
间隙锁/临键锁
1.索引上的等值查询(唯一索引),给不存在的记录加锁时优化为间隙锁。
2.索引上的等值查询(普通索引),向有遍历时最后一个值不满足查询需求时,nest-key losk退化为间隙锁。

视图


创建视图

create or replace view text_1/别名/ as SELECT * from test

检查选项
with cascaded check option

create or replace view text_1 as SELECT * from test
where id = 20 with cascaded check option

会基于条件去判断你插入的数据是否符合条件

删除视图

drop view 视图名;


触发器主要是同步数据的,就比如修改表A中性别为男的数据时,表B也发生变化,同步数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值