专注大数据培训
我们一直在领跑

最新面试题集锦(5)-mysql相关题

答案如下:

选择题:

1-12分别为 CA、C、B、B、B、A、C、C、B、B、A、A

简答题:

题一:

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

题二:

  • 索引就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。
  • 为什么要建立索引,即索引的优点:
    1) 建立索引的列可以保证行的唯一性,生成唯一的rowId;
    2) 建立索引可以有效缩短数据的检索时间;
    3) 建立索引可以加快表与表之间的连接;
    4) 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序。索引的缺点:
    1) 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大;
    2) 创建索引和维护索引需要空间成本。
  • 数据库建立索引常用的规则如下:
  • 1、表的主键、外键必须有索引; 
  • 2、数据量超过300的表应该有索引; 
  • 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 
  • 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 
  • 5、索引应该建在选择性高的字段上; 
  • 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 
  • 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
  • A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
  • B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
  • C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
  • E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
  • 8、频繁进行数据操作的表,不要建立太多的索引; 
  • 9、删除无用的索引,避免对执行计划造成负面影响;

题三:

原子性(Atomicity):事务包含的操作全部成功或者全部失败

一致性(Consistency):数据库从一个一致性状态变到另一个一致性状态 (一系列操作后,所有的操作和更新全部提交成功,数据库只包含全部成功后的数据就是数据的一致性)(由于系统异常或数据库系统出现故障导致只有部分数据更新成功,但是这不是我们需要的最终数据,这就是数据的不一致)

隔离性(Isolation):事务互相隔离互不干扰 (事务内部操作的数据对其它事务是隔离的,在一个事务执行完之前不会被其他事务影响和操作)

持久性(Durability):事务提交后数据应该被永久的保存下来,出现宕机等故障后可以恢复数据

题四:
存储引擎:
InnoDB存储引擎:mysql5.5版本之后默认存储引擎
1.容灾恢复性比较好
2.支持事务
3.支持更高的并发:使用锁粒度行为锁
4.支持外键
5.缓存管理,加快查询速度
MyISAM存储引擎:不支持事务,不支持外键,没有缓存,宕机后数据易损难恢复

题五:

一、区别
1.去什么?

truncate table 和 delete只删除数据(记录)不删除表的结构;drop语句将删除表的数据(记录)和表结构依赖的约束(constrain),触发器(trigger),索引(index),保留依赖于该表的存储过程/函数,但是变为invalid状态 .

譬如:delete 是单杀,truncate 是团灭,drop 是把电脑摔了。

2.范畴:

delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚.

譬如:delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。

3.在自增字段的表中:

truncate之后的自增字段从1开始计数了[即truncate是摧毁原来的表重新创建一张结构相同的表(有原表的结构)],delete的仍保留原来的最数数值[即如果添加数据从最值+1开始],drop将表的结构也删除了(原表数据和结构都没有了)。

譬如:drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。

二、总结:
1.执行速度:一般,drop> truncate > delete。

2.在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。

3.如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
如果想删除表,当然用drop;
如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;
如果和事务有关,或者想触发trigger,还是用delete
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

题六:

题八:

逻辑视图(概念视图):
HBase以表的形式存储数据,表由行和列组成。列划分为若干个列簇

HBase是一个键值(key-value)型数据库。HBase数据行可以类比成一个多重映射(map),通过多重的键(key)一层层递进可以定位一个值(value)。因为HBase数据行列值可以是空白的(这些空白列是不占用存储空间的),所以HBase存储的数据是稀疏的。

(1)表(table):类似于关系型数据库中的表,即数据行的集合。表名用字符串表示,一个表可以包含一个或者多个分区(region)。

(2)行键(row key):用来标识表中唯一的一行数据,以字节数组形式存储,类似于关系型数据库中表的主键(不同的是从底层存储来说,行键其实并不能唯一标识一行数据,因为HBase数据行可以有多个版本。

但是,一般在不指定版本或者数据时间戳的情况下,用行键可以获取到当前最新生效的这行数据,因此从用户视图来说,默认情况下行键能够标识唯一一行数据),同时行键也是HBase表中最直接最高效的索引,表中数据按行键的字典序排序。

(3)列族(column family):HBase是一个列式存储数据库,所谓列式就是根据列族存储,每个列族一个存储仓库(Store),每个Store有多个存储文件(StoreFile)用来存储实际数据。

(4)列限定符(column qualifier):每个列族可以有任意个列限定符用来标识不同的列,这个列也类似于关系型数据库表的一列,与关系型数据库不同的是列无须在表创建时指定,可以在需要使用时动态加入。

(5)单元格(cell):单元格由行键、列族、列限定符、时间戳、类型(Put、Delete等用来标识数据是有效还是删除状态)唯一决定,是HBase数据的存储单元,以字节码的形式存储。

(6)版本(version):HBase数据写入后是不会被修改的,数据的Put等操作在写入预写入日志(Write-Ahead-Log,WAL)(类似于Oracle Redo Log)后,会先写入内存仓库(MemStore),同时在内存中按行键排序,等到合适的时候会将MemStore中的数据刷新到磁盘的StoreFile文件。

因为数据已经排序,所以只需顺序写入磁盘,这样的顺序写入对磁盘来说效率很高。由于数据不会被修改,因此带来的问题就是数据会有多个版本,这些数据都会有一个时间戳用来标识数据的写入时间。

(7)分区(region):当传统数据库表的数据量过大时,我们通常会考虑对表做分库分表。例如,淘宝的订单系统可以按买家ID与按卖家ID分别分库分表。同样HBase中分区也是一个类似的概念,分区是集群中高可用、动态扩展、负载均衡的最小单元,一个表可以分为任意个分区并且均衡分布在集群中的每台机器上,分区按行键分片,可以在创建表的时候预先分片,也可以在之后需要的时候调用HBase shell命令行或者API动态分片。
HBase是一个列式存储数据库,数据按列族聚簇存储在存储文件(StoreFile)中,在逻辑视图上面有些列是空白的,空白的列单元格不会被存储,当请求这些空白的单元格时,会返回null值。如果在查询的时候不提供时间戳,那么会返回距离现在最近的那一个版本的数据,因为在存储的时候,数据会按照时间戳来排序。

欢迎分享,转载有奖:多易教育 » 最新面试题集锦(5)-mysql相关题