1、mysql中常见的存储引擎
InnoDB:
1、innodb是mysql5.1之后默认的存储引擎,他支持事务、索引、表锁、行锁,支持系统崩溃恢复能力;
2、如果没有给表设定主键、他会去看我们表中有没有唯一索引,如果也没有唯一索引,那么会给生成一个rowid作为主键字段;
3、一般使用innodb创建表分别生成两个文件一个是*.frm,*.idb;他是索引文件跟数据在一起的,也就是聚簇索引;
MyISAM:
1、 mysql5.1之前默认的存储引擎,不支持事务,行锁,不支持系统崩溃恢复能力; 它支持表锁;他的插入和查询效率比较快。
2、使用myiam创建表他会生成三个文件分别是*.frm, *.myd(数据文件), *.myi(索引文件), 他是索引跟数据分开存储的,也就是非聚簇索引;
MEMORY:
1、他是基于内存存储的,他使执行的是hash散列算法,因此他的查询效率比较高;
2、他不支持大文件的存储(一般推荐使用blob,text);
我们一般都使用redis进行代替;
CSV:
已csv格式数据进行存储;
archive:
这种只支持insert, select 操作,不支持索引。一般用来日志的存储;
...
2、mysql varchar与char区别;
1、varchar最大长度设定65535;
2、使用最小符合要求的长度;
3、varchar(n) n小于等于255的话需要用一个字节存储长度,大于255的话则使用两个字节存储长度;
4、varchar(5)与varchar(255)保存同样的内容,硬盘存储空间相同,但内存空间占用不同,是指定大小;
5、varchar在mysql5.6之前变更长度,当255变更以上的话,可能会导致锁表的问题;
适用于一些不固定长度存储,比如(姓名等)
char:
1、char最大长度存在255;
2、char类型当我们设定char(200)是一定占用200空间的,如果我们的数据不足这个长度的话,他则会用隐藏空格来补充剩余的空间;
3、char会去除多余空白, 当我们给值后面添加空白,他会自动去除空白;
4、char类型查询效率比较高;
char类型比较适合存储一些固定的字段,比如(加密的密码,手机号、身份证号等);
3、创建表需要注意什么;
1、设定的字段越小越好;
2、设定的类型越简单越好;如可以使用整型的就使用整型; 整型的话不推荐使用int;
3、设定字段尽量避免null值;一旦我们设定了null值后期很难优化,设定null值的是他会比其他的多占用2个字节;而且在我们mysql中null值他比较特殊,很难定义;当我们使用select null !=null; 他会成功成立;
3.2 主键的选择:
1、自然主键: 与业务有关的字段,比如身份证信息可以通过身份证号码来做为主键;
2、代理主键: 与业务无关的字段,跟业务没有关联,比较容易维护;
推荐使用代理主键;
4、mysql一般使用那么数据类型存储货币
1、Decimal
2、varchar(500), 使用varchar一般都是使用将值乘以100,获取的时候在除以100这样处理;这种的使用比较少,查看不方便;更多的是使用是Decimal
5、varchar(m), 最大存储多少个字符;
varchar(m)的m是说字符个数,而不是字节。
varchar
是变长的,「varchar(64)
」 能存放0~64
个字符不等,并不一定是存了最大64
个字符,谁知道这个类型到底存了几个字符呢?innodb
设计的时候,就已经考虑到了,不过是用字节作为单位,后续我们可以根据对应字符集转变为字符来理解,innodb
必须记录变长字段varchar
真实占用的字节数L
。前面说过了,innodb
最多分配2
个字节(16个bit位)的空间去记录这个L
。
最大能记录的数字是2^16-1
是65535
个,innodb
最大能记录varchar
占用的字节数就是65535
个,utf8mb4
字符集一个字符是最大是4
个字节,65535 / 4 = 16383.75
,只要varchar
字符数不超过16383
个,innodb
就可以记录真实占用的长度L
,再多就记录不了了!所以就能解释刚刚的图了,varchar(20000)
不行,最大也就16383
个字符
但是还有一些存储的信息需要我们来考虑的!
行最大长度是65535
字节,行里面有很多东西,包括变长字段列表、NULL
值列表、记录头信息。你得考虑该字段如果允许为NULL
,NULL
值列表会占用一个字节(只要没超过8
个字段),每一列字段的变长字段实际长度会花费1~2
个字节,如果该字段的数据太大,会变成溢出列,该字段的数据会分成很多行存储(后面会讲,你可以看完NULL
值列表和溢出列后再回来看这个例子)。所以即便提示16383
个字符,你也绝对不可能存到16383
。
6、innodb三大特性
1、自适应哈希算法;
2、buffer pool
3、双写缓存(double write buffer)
解决mysql系统崩溃恢复能力
7、数据库的并发操作引来的问题
1、脏读: 当我们事务一进行对一张表修改操作,此时还没有commit操作, 我们事务二进行查询这条记录查询到这条数据,而事务一可能会引发一些异常操作把这条数据回滚了;这是我们的事务二读取的也就是脏数据;
2、不可重复读:一个事务读取同一个数据,而两次读取的数据不一致引发的问题,如:事务一查询结果,这时事务二将这个结果进行修改并且commit操作,而我们事务一再次查询,导致两次的结果查询不一致;
3、幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读;如: 我们事务一进行 select count(.) 查询总数,查询出来结果,这是我们事务二进行insert.. 添加一条进行,而我们事务一再次查询出来结果比之前多了一条记录(被称为幻读);
8、什么是MVCC?
MVCC(Multi-Version Concurrency Control):也就是多版本并发控制, 是为了在并发访问数据库出现的一系列问题,来解决的一种不加锁来实现读取数据处理手段,从而提高我们数据的访问效率;
实现方式:隐藏字段、undolog、readview