mysql
2021-02-22 16:06:57 55 举报
AI智能生成
123
作者其他创作
大纲/内容
mysql
常用函数
运算
转换
子主题
组函数
join
优化
数据小时写入内存
数据大时加索引,冗余信息,最好不超过五次join
join语句会有一块单独的内存块来读取俩个表的数据去进行比较,join_buffer
有索引的情况下,会根据索引建立连接,然后读取索引进行比较
存储引擎
myisam
不支持外键,事务,行级锁等功能,用于查询场景较多的场合
保存了count总数,不需要进行全表扫描
可以没有主键,可索引
非聚簇索引,索引和文件分开存储,保存的是指向文件记录的指针
innodb
目前默认的引擎
支持外键
行级锁
通过索引实现
事务
read uncommit
MVCC多版本控制协议
read commit
事务开启时,每执行一次select语句都要根据其他事务的提交生成readview快照
repeatread
事务开启时执行第一条select语句,获取当前最新提交的数据生成readview快照,在本次事务中都使用该记录作为有效值,不再去查表,但是如果执行了更新,那么就要重新获取readview快照。
readview 快照
innodb中对每一行都额外记录了回滚id和事务id,readview快照就是对一个数组,包含了已提交事务,当前活跃最小事务,当前活跃最大事务,根据该快照,来决定当前事务能读取的数据
serialable
加互斥锁
必须有主键,如果没有,则默认创建一个,因为索引会用到指针
索引
数据结构划分
hash索引
如何解决范围查询?
b+树索引
平衡树,
叶子节点存放值
类型划分
聚簇索引
innodb使用
主键索引建立聚簇索引,节点保存数据库记录
主键索引推荐使用自增id,uuid的话太长导致空间占用多,并且存储稀疏。
其他辅助索引的节点存 当前索引列的值+主键
衍生问题,回表
解决回表问题,使用覆盖索引
覆盖索引
非聚簇索引
myisam使用
节点保存主键+指向数据的指针
索引的建立
适合建立索引的列
根据查询条件和连表条件建立索引
查询中统计或者分组字段
尽可能的拓展索引,不要新建索引
不适合建立索引的列
字段离散度低
增删改操作频繁
索引列不能参与计算
锁类型
主要是读写锁
乐观悲观
间隙锁
更新时,每次会对要更新的数据加锁,加锁加的是一个范围的数据,有点像操作系统中的缓存行,结合间隙锁和mvcc可以在可重复的情况下解决部分幻读问题
事务基本特性 隔离级别
原子性A
undo-log日志保证,回滚
一致性C
代码加锁保证
隔离性I
存储引擎 事务
持久行D
内存+redo-logo
分库分表
垂直分库
分布式服务,已经对分库了
垂直分表
对表字段较多的记录,设计副表
水平分表
用时间或者记录数来划分,比如500W一个表或者三个月一个表
分表语句
主从复制
binlog
master和slaver建立连接,把binlog传给slaver
slaver接受到后将binlog写入relay-log中
启动sql线程去读取relay-log中的binlog,执行
oracle
单行函数
字符串函数
concat 字符串连接
replace 替换函数
substr 截取
lower 小写
upper 大写
trim和ltrim。rtrim
数字函数
ceil 向上取整
round 四舍五入
floor 向下取整
abs 绝对值
TRUNC 截断
日期函数
EXTRACT(fmt from d) 截取日期的部分如年月日
ADD_MONTHS,指定日期加月数
转换函数
TO_CHAR 日期和字符串比较, 数字补0
TO_NUMBER 字符串转数字
其他
nvl(x,y) x不存在返回y,存在返回x。
decode if else判断
case When
over(partaion by order by ) 开窗函数
去重方式
distinct
对查询的结果记录进行去重
group by
分组之后,对字段去重
over 开窗函数
多字段in
复制表
insert into tablea select columna from tableb
select into tablea from tableb
适用于表不存在。
自由主题
优化问题
1 count(),给主键加上唯一约束,通过查看执行计划得出结论
2 小表驱动大表
主要是in和exists的问题
子表小时用in,子表大时用exists
0 条评论
回复 删除
下一页