数据库——面试准备

Question

  mysql中的数据类型,char、varchar、text、blob的区别

Answer

  1、char是固定长度的字符串类型,字段值长度不能超过255字节。

  2、varchar是可变长度的字符串,字段值长度不能超过65535字节。

  3、text是用来保存文本内容(比如文章这一类数据),字段值长度不超过(2^32)-1个字节。

  4、blob用来存二进制的文件,比如视频、音频。

 

Question

  char(10)和varchar(10)有什么区别?如果都存入abc,会是什么情况?

Answer

  0、char和varchar后面括号中的数字,是指的字符数,而不是字节数!!!字节数要根据字符编码的长度和字符数进行计算。

  1、char是固定长度的字符串类型,所以,存入abc之后,char类型仍旧占用10字节的空间。

  2、varchar是可变长度的字符串类型,所以,存入abc之后,varchar类型只占用了4个字节空间(3字节的内容,还需要1字节存内容长度)。

  3、另外,只要存入的字符串长度超过了10,那么对于两种类型来说,都会发生截断。varchar只是可以缩,但是不能增。

  4、char会删除存入内容默认的空格,而varchar类型会保留末尾的空格。

 

Question

  mysql创建表的时候,有一个字段属性是int(5),向该字段中存入123456789,那么,真正存入的值是多少?会发生截断吗?后面的数字5是什么意思?

Answer

  1、数值指定宽度和字符串指定宽度的含义不同:字符串指定宽度之后,若超过设置的值,则会发生截断;但是数值设置宽度,并不是为了截断,而是为了显示特殊的格式。

  2、数值指定宽度的时候,必须是在指定zerofill(零填充)的时候,宽度才有效,他的功能就是:在插入值的位数比定义字段的位数要少的时候,在前面补0。

  3、比如,id int(5) zerofill,那么设置id为123的时候,读出的id值是00123,并不是原始的123;如果设置id为123456789,因为宽度已经超过了id字段设置的宽度5,那么,就不会发生0填充,所以会直接保存原数据。

  4、所以,int(5)并不是指定数值最多有5位,而是不足5位的时候,使用0填充。

  5、如果没有设置zerofill,那么,int后面的宽度是没有必要的,没有任何意义。 

 

Question

  mysql的truncate命令和delete命令有什么异同?

Answer

  相同点:都能将表中的数据给全部清除;

  区别:1、truncate为DDL语句,delete是DML语句;

  2、truncate命令清除表自增id属性,从1开始重新记录,而delete不会;

  3、truncate在事务中的操作不可回滚;delete在事务中的操作是可以回滚的;

 

Question

  知道哪些存储引擎?以及每个引擎的特点?

Answer

  

 

 

Question

  InnoDb 和 MyISAM存储引擎各自的特点以及区别?

Answer

  Innodb的特点:

    1、支持事务操作;2、数据存储在共享表空间,可以通过配置分开;3、对主键查询的性能高于其他引擎。4、支持热备份;5、支持崩溃后安全恢复;6、支持行锁;7、唯一支持外键的引擎。

  MyISAM的特点:

    1、5.1版本之前默认的存储引擎;2、唯一支持全文索引的存储引擎;3、不支持事务和行级锁;4、不支持崩溃后安全恢复;5、表存储在两个文件,MYD(数据文件)、MYI(索引文件);6、查找性能高效,修改操作的性能稍差。

  Innodb的行锁最大程度的支持并发操作,所以有很大的锁开销。

  MyISAM的表锁会锁定整张表,系统性能开销小。

 

Question

  死锁、共享锁、互斥锁、乐观色、悲观锁、意向锁

Answer

  1、死锁:A、B线程并行运行,都需要X、Y表(对X、Y表加锁),A先申请X,B先申请Y,然后A再申请Y表的时候出现阻塞,同时B表申请X表的时候出现阻塞,造成死锁。

  2、共享锁(读锁):共享的、不阻塞,多个用户可以读同一个资源,互不干扰,但是不能在有进程读该资源的时候,有另外一个进程修改该资源。

  3、互斥锁(写锁):一个写锁是会阻塞其他的读锁和写锁,只允许一个用户进行写入操作,防止其他用户读取正在修改的数据。

  4、乐观锁:假设不会发生并发问题,实现方式: 使用自增长的整数表示数据版本号。更新时检查版本号是否一致,比如数据库中数据版本为6,更新提交时version=6+1,使用该version值(=7)与数据库version+1(=7)作比较,如果相等,则可以更新,如果不等则有可能其他程序已更新该记录,所以返回错误。

  5、悲观锁:假设肯定会发生并发问题,共享锁和互斥锁都是悲观锁。实现方式:使用共享锁和互斥锁实现。

  6、意向锁:如果没有意向锁,当一个事务对表中的某一行进行修改时(会加排它锁),如果另外一个事务要对全表进行修改,那么就需要对所有的行是否被锁定进行扫描,在这种情况下,效率是非常低的;不过,在引入意向锁之后,当某个事务使用行锁对表中的某一行进行修改之前,会先为添加意向排他锁(IX),再为记录添加排他锁(X),在这时如果有人尝试对全表进行修改就不需要判断表中的每一行数据是否被加锁了,只需要通过等待意向排他锁被释放就可以了。

 

Question:

  InnoDB的行锁、间隙锁、next-key锁

Answer:

  行锁(Record Lock):InnoDB支持行锁,当多个事务更新同一行数据时,就会出现锁等待;InnoDB的行锁其实市价在索引上的,如果更新操作没有使用索引,那么仍旧是锁表;

  间隙锁(Gap Lock):为了避免幻读,只锁定行记录数据的范围,不允许在此范围内插入数据,只对“可重复读”隔离级别有用。

  next-key锁:是行锁和间隙锁的组合,当InnoDB扫描索引记录时,会先对选中的索引记录加上行锁,在对索引记录两边的间隙上加间隙锁;

 

Question

  索引对性能的影响?

Answer: 

  好处:

    1、大大减少需要扫描的数据量。2、避免排序和使用临时表。3、将随机I/O变为顺序I/O。4、提高查询速度。

  坏处:

    1、降低写的速度,占用磁盘(因为索引保存在硬盘中)。

    2、每次修改表数据时,都会重新建索引。

  关于索引,可以看我总结的这篇博客:

  MySQL 通过多个示例学习索引

 

Question

  什么时候使用全表扫描?什么时候使用索引?

Answer

 

Question

  知道哪些类型的索引?每种索引的特点?

Answer

  1、普通索引:最基本的索引,没有任何约束限制

  2、唯一索引:与主键索引类似,但是不允许出现相同的值(唯一性约束)。

  3、主键索引:特殊的唯一索引,不允许有空值。

  4、复盖索引(组合索引):将多个列组合在一起创建索引,可以覆盖多个列,比如“章-节-段”建立索引

  5、外键索引:只有Innodb支持,保证数据一致性、完整性,实现级联操作。

  6、全文索引:只有MyISAM引擎支持,并且只支持对英文进行全文检索。

 

Question

  主键索引和唯一索引的区别?

Answer

  1、一个表只能有一个主键索引,但是可以有多个唯一索引。

  2、主键索引一定是唯一索引,而唯一索引不一定是主键索引。

  3、主键可以和外键构成完整性约束,防止数据不一致,而唯一所以不支持外键。

 

Question

  创建索引的原则?

Answer

  1、最适合创建索引的列是出现在where子句中的列,或者是连接子句中的列,而不是select选择的列。

  2、索引列的基数越大,索引的效果越好,比如性别只有男和女两个值,所以性别不适合建索引;而姓名这种几乎不相同的列,建立索引的效果最好。

  3、对字符串的列进行创建索引的时候,应该制定一个索引长度,可以节省索引空间。

  4、根据情况创建复合索引,比如要找第二章的第2小节,那么可以创建章-节两个字段的符合索引。比只创建一个章的索引查询要快。

  5、避免创建过多的索引,因为索引也会占用磁盘空间,由于索引是在磁盘上,所以写操作的操作效率不高(I/O)。

  6、主键尽可能使用整型来创建索引。

 

Questioin

  复合索引要遵循前缀原则,什么是前缀原则?

Answer

  对于索引key(a, b, c)来说,创建的是一个复合索引,并不是单独对a,b,c创建索引。

  where a = 1 and b = 2  and  c = 3;       会使用索引

  where a = 1 and b = 2 ;      会使用索引

  where a = 1;会使用索引

  where a = 1 and c = 3 and b = 2;   会使用索引

  where a = 1 and c = 3;   不会使用索引,因为c前面的b没有使用

  where b = 2 and c = 3;   不会使用索引,因为b前面的a没有使用

  可以理解为,创建索引的时候,就是将a,b,c这3列的值连起来作为一个字符串,对这个字符串创建索引,所以只能从最左边开始配置时,才会使用索引。

 

Question

  当使用like进行检索时,想要使用索引,需要注意什么?

Answer

  假设是对name字段创建了索引

  1、where name like 'test%' 会使用索引。

  2、where name like '%test%'    不会使用索引。但是这种方式可以使用全文索引。

 

Question

  where子句中,哪些筛选语句不会使用已创建索引(索引失效)?

Answer

  1、如果or子句前面的列创建了索引,而or子句后面的列没有创建索引,那么前面创建的索引也不会被用到。

  2、使用like的时候,‘test’和‘test%’可以用到,但是‘%test%’不能使用索引。

  3、如果列类型是字符串,那么在查询的时候,字段值要加上引号,否则不会使用索引。

 

Question

  使用事务处理的时候需要注意什么? 

Answer

  1、进行事务操作涉及到的表都要使用Innodb存储引擎,如果某一个表不是Innodb引擎,那么这个事务是不会成功的。

  2、如果一个表不支持事务处理,但是对这个表使用事务,那么,不会出现报错,但是事务不会生效而已。

 

Question

  连接数据库的命令?

Answer

  mysql -h -u -p -P

  -h:主机(ip或域名)

  -u:用户名

  -p:密码

  -P:端口(省略时,默认使用3306)

 

Question

  如何分析SQL语句的性能?

Answer

  1、分析慢查询日志,参考:https://www.cnblogs.com/-beyond/p/9391105.html

  2、使用show profiles命令。先执行set profiling=1来开启。之后,mysql服务器会将每一条语句的执行时间都记录到一个临时表中。

  3、使用show status命令,可以得到一些计数器。

  4、使用show processlist,得到进程列表。

  5、explain。分析单条SQL语句,加载SQL语句之前即可。

 

Question

  分表和分区的工作原理?各自的使用场景和优缺点?

Answer

  1、分区

    原理:初始状态为一个表的数据是保存在一个文件中,分区是指将之前的一个文件数据通过某种策略,平均或者接近平均地分为多个块,每一块都是一个物理文件,但对上层来说是透明的,在上层看来这仍旧是1张表(1个文件)。创建分区使用partition by xxx来分区。将相关的数据放在一个区,比如年龄10-30的分一个区,31-40分一个区,41-60分一个区。

    使用场景:表数据非常大的时候,无法全部装入内存;可以对独立的分区进行独立的操作;各分区可以放在不同的机器上。

    限制:最多不超过1024个分区。无法使用外键;每个分区的存储引擎要一致。

  2、分库分表

    原理:

    a、水平分割:将一张表分成多张小的数据表,比如一张表有1亿条记录,在查询的时候,即使有索引,查询也不会太快。可以考虑将每1千万条记录转存到一张表中,分成10张表。缺点是:在查询的时候,需要制定多个表名,查询所有数据要使用union操作。

    b、垂直分割:将一些列拆分出来,放在一个表,然后将另外一些列拆分出来放在另外一个表中。拆分之后的多个表使用某个列来连接。如果一些列很少用到的时候,可以考虑分表。缺点是:查询的时候,会需要先连接才查询。

 

Question

  MySQL主从复制原理

Answer

  主库将操作都记录到二进制日志binlog里面,从库将主库的binlog复制到自己的中继日志里面,然后将日志里面记录的命令执行一遍,达到数据同步的原理。

 

Question

  哪些情况会使用建立的索引,哪些情况不会使用建立的索引?

Answer

  参考:https://www.cnblogs.com/-beyond/p/9574636.html

 

Question

  介绍一下存储过程?存储过程的优缺点?会加快运行速度吗?

Answer

  一下内容摘抄自百度百科。

  存储过程是一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

  优点:

    1、重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量,不用每次都编写一大堆SQL命令。

    2、减少网络流量。当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用,调用的时候只需要传递存储过程的名称以及参数就可以了,不用传递多条SQL语句,因此降低了网络传输的数据量。

    3、加快速度:存储过程(多条SQL)第一次执行之前会进行编译一次(多条SQL编译出一个程序),之后不会执行存储过程的时候不会再进行编译,而是直接运行编译出来的二进制程序;相反,使用PHP传输的SQL语句,虽然第一次执行的时候,会编译一次,但是编译出来的程序只会保留一小段时间,之后就会清除,所以过一段时间后在执行这条SQL时,又会重新编译一次,相对于存储过程来说,会稍微慢一点。

  缺点:

    1、调试麻烦

  

 

Question

  数据库事务的ACID

Answer

  事务的四个特性,分别是ACID。

  A(atomicity)原子性:表示事务内的所有操作是一个整体,要么全部成功,要么全部失败。事务中多个操作,只有当所有操作都成功完成,没有出错误,那么事务才认为是成功的;否则只要有一个操作失败了,就会认为事务失败了,同时,会将该事务中已经成功执行的操作进行回滚。

  C(Consistency)一致性:表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态。事务执行的结果必须是使数据库从一个一致性状态变为另一个一致性状态。一致性状态可以这样理解,一个事务包含两个操作,如果在事务完成后,数据库只有其中一个操作的结果生效,而另外一个操作执行后却没有生效(数据库中没有改变),此时就是不一致状态。如果数据库保存了两个操作的结果,那么就处于一致性状态。

  I(isolation)隔离性:事务查看数据时,数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另外一个事务修改他之后的状态,而不会是查看到中间状态的数据一个事务的执行不能被其他事务干扰。

  D(durability)持续性:事务一旦提交之后,那么事务对数据库的改变就应该是永久的(持久化到硬盘中,写入到硬盘中)。

 

Question:

  事务的隔离级别

Answer:

  1、读未提交:在其中一个事务中,可以读取到其他事务中未提交数据变化,这种读取其他事务未提交的数据情况,称为“脏读”;

  2、读已提交:在其中一个事务中,可以读取到其他事务已经提交的数据变化,这些数据和本事务刚开始的时候不一样,这种读取叫做“不可重复读”;

  3、可重复度:MySQL默认事务隔离界别,在其中一个事务开始,直到该事务结束,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,可避免脏读、不可重复读和幻读;

  4、串行:在每个读的数据行上加表级共享锁,每次写数据,都要加表级排它锁;会降低数据库并发。

 

Question:

  各种读的区别

Answer:

  1、脏读:在一个事务当中可以读取到其他事务未提交的数据(读未提交隔离级别);

  2、不可重复读:在一个事务中,读取到其他事物对数据进行的修改操作,因为数据已经被修改,所以无法在读取到之前的数据,称为不可重复读(读已提交隔离级别);

  3、幻读:在一个事务当中,可以读取到其他事务中新增的数据,这种情况叫做“幻读”(读已提交隔离级别);

  4、可重复度:在一个事务中,事务开始时读取到什么数据,在整个事务未提交前,所读取到的数据都是一样的(可重复度隔离级别)。

posted @ 2018-08-23 21:11  寻觅beyond  阅读(454)  评论(0)    收藏  举报
返回顶部