1、mysql
存储引擎及区别
1、MyISAM 是非事务的存储引擎,适合用于频繁查询的应用。表锁,不会出现死锁,适合小数据,小并发。
2、innodb是支持事务的存储引擎,合于插入和更新操作比较多的应用,设计合理的话是行锁(最大区别就在锁的级别上),适合大数据,大并发。
索引方法
1、B+Tree索引
2、Hash索引
索引类型
1、Primary 主键索引
2、Unique 唯一索引
3、NOrmal 普通索引
4、Spatial 空间索引(只能用于myisam引擎)
5、FullText 全文索引(长字符串用)
最左前缀
1、联合索引的多个字段中,只有查询条件为联合索引的第一个字段时,查询才能使用索引
2、对于索引的第一个字段,用like时左边必须是固定值,通配符只能出现在右边
覆盖索引
覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键上去取数据。
事务的ACID属性
1、原子性(Atomicity):事务是最小的工作单位
2、一致性(Consistency):要么都成功,要么都时报
3、隔离性(Isolation):多个事务间不会相互影响
4、持久性(Durability):事务不可逆
事务隔离级别
1、读未提交
2、读提交
3、可重复读(mysql innodb默认隔离级别)
4、串行读
并发事务带来的问题
1、更新丢失
1.1 回滚覆盖
1.2 提交覆盖
2、脏读,读到了其他事务为提交已修改的数据
3、不可重复读,两次读取的数据不一样
4、幻读,两次读取的数据条目不一致
MVCC(Multi-Version Concurrency Control)
多版本并发控制(乐观锁的一种实现方式)
每一行数据中额外保存两个隐藏的列:当前行创建时的版本号和删除时的版本号(可能为空,其实还有一列称为回滚指针,用于事务回滚,不在本文范畴)。这里的版本号并不是实际的时间值,而是系统版本号。每开始新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询每行记录的版本号进行比较
数据库三大范式
1、属性原子性不可再分(关系型数据库都满足)
2、非主属性要依赖于主属性
3、非主属性的属性不能有传递依赖关系
char和varchar的区别
1、char定长,不足部分右填充空格补足,varchar不定长,指定长度后不空格补足
2、char检索效率搞,varchar检索效率低
3、char最大长度255,varchar
enum与set区别
都是列表,enum单选,set多选
mysql锁类型
表级锁(意向共享锁、意向排他锁)
行级锁(共享锁、排他锁)
页面锁
慢sql排查
-- profiling 是否开启
select @@profiling;
-- 查看sql执行时间
show profiles;
-- 查看sql耗时详情
show profile for query 155;
查看版本
select version()
查看表索引
show index form table_name
带行号查询
5.7以及之前版本
select @RN := @RN + 1 ,t1.* from tabke_name t1,(select @RN:=0) t2
8。0版本(同SQL server写法)
select row_number() over(order by t1.id) as RN,t1.* from table_name t1
sqlserver 写法
替换插入
insert into table_name(a,b) values(1,2) on duplicate key on update b = b+1;
replace into table_name(a,b)values(1,2);