MySQL 实用基础
程序员文章站
2022-07-06 10:52:55
第一问:为什么要使用固定字段?逻辑删除字段,行业共识,数据库不允许物理删除数据,哪怕是错误数据,错误数据也是有一定价值的。然后可快速恢复,就是数据库的手动后悔药。创建人,对于数据的掌控,很重要,谁创建的,一般使用在后台管理中较多。创建时间,对于数据的掌控 数据何时进入数据库 很重要。更新时间,对于数据的掌控 数据何时更 也很重要。备注字段,数据库一般都会涉及到手动修改,或者间接关联,都可使用这个字段标注。第二问:为什么建议使用 NOT NULL 限制列属性?读取.....
第一问:为什么要使用固定字段?
逻辑删除字段,行业共识,数据库不允许物理删除数据,哪怕是错误数据,错误数据也是有一定价值的。然后可快速恢复,就是数据库的手动后悔药。
创建人,对于数据的掌控,很重要,谁创建的,一般使用在后台管理中较多。
创建时间,对于数据的掌控 数据何时进入数据库 很重要。
更新时间,对于数据的掌控 数据何时更 也很重要。
备注字段,数据库一般都会涉及到手动修改,或者间接关联,都可使用这个字段标注。
第二问:为什么建议使用 NOT NULL 限制列属性?
读取数据的时候, 会带来大量的数据非空检查, 否则抛出NullPointException。
NULL值列和其他列进行操作可能引发错误,或者意外,如统计不正确,对NULL值得判断无法使用到索引,也不能直接比较。
NULL值到非NULL的更新无法做到原地更新,更容易发生索引分裂,从而影响性能。
Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引 --出自《高性能Mysql》
第三问:为什么select,update 语句的 where后的条件应该创建二级索引?
查询快。
mysql行锁是加在索引上的,使用索引 可增加并发性能,减少锁争用情况。
尽量使用主键去做更新,查询;在使用二级索引更新时候,可能出现next-key 锁,造成锁住多余的行( 在8.0.19版本中 已修复)
第四问:select from join where group by order by limit mysql语法执行顺序?
from
join 不要关联太多
where 不要在 = 号左边做表达式计算,不要使用!=,
select
group 性能开销大头,可能涉及文件系统排序,创建临时表
order 性能开销大头,可能涉及文件系统排序,涉及到创建时间排序,可考虑使用id代替,非常不建议对非驱动表字段进行排序
limit 请多用limit
第五问:什么是一级索引,什么是二级索引?
INNODB:聚簇索引,一级索引:主键索引,索引上存储数据;二级索引:非主键索引,索引上存储主键。
MYISAM:非聚簇索引,索引上存储数据指针
MySQL 索引结构(MyISAM的有错误,应该是索引上存储指针)
第六问:MYSQL锁机制
乐观锁: 事务执行到哪就申请哪的资源的锁
悲观锁: 事务开始先申请锁住需要的全部资源
全局事务读锁: MYSQL最强锁 flush table with read lock
表锁:
页锁:磁盘与内存数据交互时候使用到
行锁:
元数据锁:DDL DML 产生
间隙所: 锁住俩条记录之间的间隙
记录锁: 行锁
next-key:间隙所+记录锁
备份锁: 8.0 备份时候使用
S锁 共享锁,加锁读的情况。 (意向锁作用,A事务正在加锁修改a表的一行数据,B事务现在想修改整个a表的数据,如果没有意向锁,则,B的事务需要判断表中的每一行是否已被行锁锁住,效率奇差,而有了意向锁,只需要判断表是否存在意向锁,便可,解决了行锁,表锁同时存在的时候的锁的效率问题)
X锁 排它锁
IS锁 属于表锁,属于共享锁
IX锁 属于表锁,属于共享锁
避免死锁的方式: 越是轻量的事务,占有越少的锁资源,这样发生死锁的几率就越小,不同事务中,表的更新顺序应当一致。尽量按主键更新数据。mysql有死锁检测线程,会放弃影响小的事务。
第七问:MYSQL学习推荐几个公众号
老叶茶馆
MySQL技术
数据库SQL
数据库随笔
爱可生开源社区
pinCAP
阿里巴巴数据库技术
腾讯数据库技术
腾讯云数据库
巨衫数据库
本文地址:https://blog.csdn.net/qq_32682305/article/details/107310388