网站建设丶金手指C排名15,产品网络推广服务,网站建设的质量区别,胶州市 网站建设Java知识点总结#xff1a;想看的可以从这里进入 目录2.4、行锁、表锁2.5、主键、外键2.5.1、主键2.5.2、外键2.6、表的关联关系2.4、行锁、表锁
MyISAM默认采用表级锁#xff0c;InnoDB默认采用行级锁。 表锁#xff1a;开销小#xff0c;加锁快#xff0c;不会出现死锁… Java知识点总结想看的可以从这里进入 目录2.4、行锁、表锁2.5、主键、外键2.5.1、主键2.5.2、外键2.6、表的关联关系2.4、行锁、表锁
MyISAM默认采用表级锁InnoDB默认采用行级锁。 表锁开销小加锁快不会出现死锁但锁的粒度较大容易发生锁冲突并发度低 MyISAM在执行查询语句SELECT前会自动给涉及的所有表加读锁在执行更新操作UPDATE、DELETE、INSERT等前会自动给涉及的表加写锁。读锁会阻塞写写锁会阻塞读和写 表独占写锁会阻塞其它进程对同一表的读和写操作。表共享读锁不会阻塞其它进程对同一表的读请求但会阻塞对同一表的写请求。 行锁开销大加锁慢会出现死锁但是锁的粒度最小不容易发生锁冲突并发度高 insertdeleteupdate在事务中都会自动默认加上排它锁select语句后加上for update会被加上排它锁。其它事务可以读取但不能进行更新和插入操作 MySQL的行锁是通过索引加载的行锁是加在索引响应的行上的要是对应的SQL语句没有走索引则会全表扫描行锁则无法实现取而代之的是表锁此时其它事务无法对当前表进行更新或插入操作。 对于主键索引直接锁住主键索引即可。 对于普通索引先锁住普通索引再锁住主键索引因为一张表只有通过主键索引才能确保锁是唯一的 页面锁介于表锁和行锁之间
MySQL锁类别资源开销加锁速度是否会出现死锁锁的粒度并发度表级锁小快不会大低行级锁大慢会小高页面锁一般一般不会一般一般
但实际上MySql的存储引擎真实的实现不是简单的行级锁一般都是实现了多版本并发控制MVCC。MVCC是行级锁的变种多数情况下避免了加锁操作开销更低。MVCC是通过保存数据的某个时间点快照实现的。
2.5、主键、外键
主键外键约束索引定义唯一标识不能有重复的不允许为空两张表有关联时可设置外键外键的字段存放的数据是另一张表的主键值可重复 可为空该字段没有重复值但可以有一个空值作用保证数据的完整性不重复可加快数据库的操作速度表示和其他表有关联如购物车表里要有商品id和购买用户的id提高查询排序的速度个数一个表只能有一个主键一个表可以有多个外键一个表可以有多个唯一的索引
2.5.1、主键
主键类似于我们日常生活中的身份证一个身份证号码代表一个人身份证号码是不会重复的所以我们经常用身份证去区分一个人而主键大致的功能也是如此。
如果我们定义了主键(PRIMARY KEY)那么InnoDB会选择主键作为聚集索引。如果没有显式定义主键则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。如果没有这样的唯一索引则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增)。
我们在建表的时候一般会创建一个主键通常都是设置为自增auto_increment 且不可为空而且一个表中只能有一个primary key主键。 如果表使用自增主键那么每次插入新的记录记录就会顺序添加到当前索引节点的后续位置当一页写满就会自动开辟一个新的页。如果使用非自增主键由于每次插入主键的值近似于随机因此每次新记录都要被插到现有索引页的中间某个位置此时MySQL不得不为了将新记录插到合适位置而移动数据甚至目标页面可能已经被回写到磁盘上而从缓存中清掉此时又要从磁盘上读回来增加了很多开销同时频繁的移动、分页操作造成了大量的碎片得到了不够紧凑的索引结构后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
主键虽然在语法上并非必须的但是我们在数据库建表规定中必须给每张表添加一个主键便于后续对数据库的维护和管理。 2.5.2、外键
关系型数据库是通过一个个表来存储数据的而一些表和表之间会有某些关联所以我们通过外键约束来将数据联系起来。使用外键与主键结合即表的外键就是另一张表的主键作用就是通过主外键的之间关系使对张表中的数据更好的关联。
外键就是你在表中的某一字段和另外一个表中的某个字段关联起来。比如把学生和班级关联起来表示该学生是几班的。 外键可以保证数据的完整性和一致性外键是某个表中的一列它包含在另一个表的主键中为一张表创建一个外键这个外键总是关联另一张表的主键。外键也是索引的一种是通过一张表中的一列指向另一张表中的主键来对两张表进行关联。一张表可以有一个外键也可以存在多个外键与多张表进行关联。
外键的作用是保证数据的一致性和完整性并且减少数据冗余。
当插入新数据时其外键的字段在插入数据时如果该关联表的主键不存在时会阻止插入数据。当删除数据时如果该外键字段所关联的表中该主键数据还在使用时则阻止删除该数据。外联的主表修改数据时添加为外键的字段会一起修改
-- 添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 外表表名(主键字段名) -- 限制外表中的外键改动默认值也是最安全的设置
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]需要主要在建表规范中不建议使用外键约束外键的概念在应用层解决即java代码中解决过多的使用外键约束在开发过程中会导致开发的繁琐测试数据很不方便
2.6、表的关联关系
在MySQL中表和表之间的关联分为四种一对一关联、一对多或多对一关联、多对多关联、自我关联 一对一一张表的一条记录一定只能与另外一张表的一条记录进行对应反正亦然。这时候主表的主键和从表的主键形成主外健关系让一张表的主键同时作为另一张表的主键同时这一张表的主键不能自增。 比如在建立数据表时如果一张表的字段过多那么为了提高效率通常会把一张表分成两张表来存储 多对一、一对多一张表中有一条记录可以对应另外一张表中的多条记录另外—张表的一条记录只能对应第—张表的一条记录 比如学生关联班级多个学生关联一个班级一个班级关联多个学生 多对多表A的一条记录能够对应另外一张表B中的多条记录同时表B中的一条记录也能对应表A中的多条记录。这种的对应关系通常是专门建立第三张表这个表专门用来表示表A和表B的对应关系。 比如说员工和职位一个员工可以担任多个职位一个职位也能由多个员工担任 自我连接在一张表内引用自己的字段 比如常见的省市区在一张表时就是通过设置父级id来实现的