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优化
- 查询SQL尽量不要使用select *,而是具体字段,节省资源
- 避免在where子句中使用or来连接条件,可能导致索引失效
- 使用varchar代替char
- 尽量使用数值替代字符串类型
- 查询尽量避免返回大量数据
- 使用explain分析你SQL执行计划
- 索引不宜太多,一般5个以内
- 避免在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也发生变化,同步数据。