写了好几天理财的,今天重回技术,写一写数据,我发现这些题好多都是MySQL相关的,先写起来吧,预计三篇,今天第一篇。
1.请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
(1)Read Uncommited,读到未提交数据,所有事务都可以看到其他未提交事务的执行结果。很少用于实际应用,因为他的性能也不比其他级别好多少。读取到未提交的数据,也被称之为脏读,一旦实际最终数据回滚了,还会导致一些列问题。
(2)Read Commited,读到提交内容,这是主流数据库系统的默认隔离级别(但不是Mysql 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读 ( Nonrepeatable Read ), 因为同一事物的其他实例在该实例处理期间可能会有新的Commit ,所以同一 select 可以返回不同结果。
(3)Repeatable Read(可重读):这是Mysql的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题,幻读(Phantom Read),简单的说,幻读指当用户读取某一范围的数据行时,另一事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。
(4)Serializable(可串行化):这是最高的隔离级别,它通过强制事务排序,使之不可能互相冲突从而解决幻读问题。简而言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。实际上,不同的事务同时开启同一个表的查询是没有问题,但是一旦开启查询,则其他事务均不可对该表进行修改插入操作,直到其他事务commit后,才可以进行插入修改操作。
2.在Mysql中ENUM的用法是什么?
直接上代码
//建表语句,enum类型,可以指定后边的具体枚举值,类似与java的枚举值
CREATE TABLE `test_enum` (
`ID` bigint NOT NULL COMMENT 'PRIMARY KEY BATCH ID',
`STATUS` enum('NAME','SEX') NOT NULL,
PRIMARY KEY (`ID`)
);
//插入时候同样可以直接使用'NAME'或者'SEX',1(等同于'NAME'),2(等同于'SEX')
insert into test_enum values(1,'NAME');
insert into test_enum values(2,'SEX');
insert into test_enum values(3,1);
insert into test_enum values(4,2);
//查询
select * from test_enum;
//输出
1 NAME
2 SEX
3 NAME
4 SEX
//修改增加Enum类型
ALTER TABLE test_enum MODIFY COLUMN STATUS enum('NAME','SEX','TTTT')
3.CHAR和VARCHAR的区别?
(1)char类型时定长的类型,即当定义的是char(10),输入的是"abc"这三个字符时,它们占的空间一样是10个字节,包括7个空字节。当输入的字符长度超过指定的数时,char会截取超出的字符。而且,当存储char值时,MySQL是自动删除输入字符串末尾的空格。char是适合存储很短的、一般固定长度的字符串。例如,char非常适合存储密码的MD5值,因为这是一个定长的值。对于非常短的列,char比varchar在存储空间上也更有效率。
(2)varchar(n)类型用于存储可变长的,长度为n个字节的可变长度且非Unicode的字符数据。n必须是介于1和8000之间的数值,存储大小为输入数据的字节的实际长度+1或2,比如varchar(10), 然后输入abc三个字符,那么实际存储大小为3个字节。除此之外,varchar还需要使用1或2个额外字节记录字符串的长度,如果列的最大长度小于等于255字节(是定义的最长长度,不是实际长度),则使用1个字节表示长度,否则使用2个字节来表示。
(3)从占用空间上考虑,varcahr较合适;从效率上考虑,用char合适。二者之间需要权衡。
4.drop,delete与truncate的区别
(1)delete和truncate都会清除表数据,但不会将整个表干掉,而drop可以将整个表干掉,也可以适用一些索引,约束,触发器等,都是直接干掉操作。
(2)TRUNCATE会清理这个表和索引所占用的空间,这些空间都会恢复到初始大小,DELETE操作不会减少表或索引所占用的空间,之前数据即使被删掉也占用空间。
5.局部性原理与磁盘预读
(1)局部性原理,当一个数据被用到时,其附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。
(2)磁盘的读取速度要比内存慢很多,为了提高效率,要尽量减少磁盘I/O,所以就是每次读取都多读一些,也就是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。因为磁盘是顺序读取的,因此预读只是在原有的基础上再多继续读一些,返回到内存中,速度也是非常快的。
(3)实际上这个是为了引入B+树以及B-树的存储索引结构,提高索引查询的效率。但是这个我是不太懂,后边抽时间输出一下,树,B+树、B-树,红黑树,写一篇。
谢各位的阅读,谢谢您动动手指点赞,万分感谢各位。另外以下是我之前写过的文章,感兴趣的可以点进去继续阅读。
历史文章
Hadoop系列-入门安装
Hadoop系列-HDFS命令
Hadoop系列-Hive安装
Hadoop系列-Hive数据库常见SQL命令
Hadoop系列-HBase数据库
Hadoop系列-HBase数据库(二)
Hadoop系列-HBase数据库JAVA篇
Hadoop系列-Spark安装以及HelloWorld
JAVA面试汇总(五)数据库(一)
JAVA面试汇总(五)数据库(二)
JAVA面试汇总(五)数据库(三)
JAVA面试汇总(四)JVM(一)
JAVA面试汇总(四)JVM(二)
JAVA面试汇总(四)JVM(三)
JAVA面试汇总(三)集合(一)
JAVA面试汇总(三)集合(二)
JAVA面试汇总(三)集合(三)
JAVA面试汇总(三)集合(四)
JAVA面试汇总(二)多线程(一)
JAVA面试汇总(二)多线程(二)
JAVA面试汇总(二)多线程(三)
JAVA面试汇总(二)多线程(四)
JAVA面试汇总(二)多线程(五)
JAVA面试汇总(二)多线程(六)
JAVA面试汇总(二)多线程(七)
JAVA面试汇总(一)Java基础知识