MySQL锁有几种;死锁是怎么产生的;
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。
死锁的第一种情况
一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。
解决方法:
这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进 行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。
为何,以及如何分区、分表;
日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
什么是分表?
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
什么是分区?
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。
MySQL的char varchar text的区别;
char(n),定长,基本没有碎片,索引速度极快。n最大为255,长度不够n个字符,用空格补齐
varchar(n), 不定长,索引速度没有char快,n最大为65535,不会去掉尾部空格
text, 不定长,速度慢,上限65535(216-1)字节,不会去掉尾部空格,长度不够的话还可以用mediumtext上限是(224-3)
一些总结:1. 经常变化的字段用varchar
2. 知道固定长度的用char
3. 超过255个字符的只能用varchar和text
4. 能用varchar的地方不用text
NoSQL和关系数据库的区别;
关系型数据库:最经典的数据结构是表,由二维表及其之间的联系组成的一个数据组织。
优点:数据之间,表与表之间存在着联系,有利于数据的正删改查,有事物关系,能够保证数据的完整性。易于维护,使用方便,支持sql,可以进行复杂的查询,
缺点:读写性能较差,对海量的数据非常吃力。固定的表结构,灵活度欠缺
非关系型数据库,数据和数据之间不存在关系,他们之间是单独存在的。
优点,格式灵活,速度快,成本低,
缺点,不提供sql支持,复杂查询方面欠缺,没有事务处理
Redis有几种常用存储类型;
redis五中常见存储类型,字符串,列表,哈希表(字典),集合,有序集合