mysql常见问题

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-165535个,innodb最大能记录varchar占用的字节数就是65535个,utf8mb4字符集一个字符是最大是4个字节,65535 / 4 = 16383.75,只要varchar字符数不超过16383个,innodb就可以记录真实占用的长度L,再多就记录不了了!所以就能解释刚刚的图了,varchar(20000)不行,最大也就16383个字符

但是还有一些存储的信息需要我们来考虑的!

行最大长度是65535字节,行里面有很多东西,包括变长字段列表、NULL值列表、记录头信息。你得考虑该字段如果允许为NULLNULL值列表会占用一个字节(只要没超过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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值