数据库相关内容

Posted 青春无敌美少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库相关内容相关的知识,希望对你有一定的参考价值。

最近面试,关于数据库的一些高频问题

1.聚簇索引与非聚簇索引的区别

聚簇索引:将索引与数据放在一起,当找到索引后,也就找到对应的数据了。每张表只能建立一个聚簇索引,但是该索引可以包含多个列(一般使用的是主键等不经常更新的列)。
非聚簇索引:数据储存于索引分开,叶节点指向了对应的数据行。

2.数据库引擎

1).InnoDB引擎

支持行级锁,支持事务处理,支持外键,支持崩溃修复能力和并发控制,支持MVCC。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

2). MYISAM引擎

和InnoDB相比,只支持表级锁,其他都不支持,插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

3.数据库回表

我们如果直接用主键查找,用的是聚集索引,能找到全部的数据。如果我们是用非聚集索引查找,如果索引里不包含全部要查找的字段,则需要根据索引叶子节点存的主键值,再到聚集索引里查找需要的字段,这个过程也叫做回表。

1)如何避免回表

因为如果用到了回表,就需要二次查询的过程,效率肯定更慢,很简单,回表是因为要查询的字段在非聚集索引里没有,所以在满足需求的情况下,我们尽量使非聚集索引里有要查询的索引字段。
在查询时,可以尽量用聚集索引来查(也就是用主键来查询),或者根据业务需求,建好的索引,满足索引查询字段。但是实际业务中,很难建立一个索引就能满足所有查询要求,所以,正常情况,回表也没事,只要能用到索引也能大大加快查询速度。

4.having和where 的区别

having筛选字段必须在select中出现,大多数情况下和group by一起使用,对分组后的结果进行进一步筛选。
where使用在分组之前,根据条件从表中筛选出数据。
使用顺序:where group by having
eg:
select __ from table group by role having 条件

5.数据库常用语句

1).增

insert into table values( , );

2).删

delect from table where 条件;

3).查

select * from table where 条件1 group by 属性 having 条件2;
先执行where进行筛选,然后在group by ,最后having筛选。

4).改

update table set 修改属性值 where 条件;

(5)新增字段,修改字段,改变表的列名
ALTER TABLE student ADD age INT(4);

修改字段
1、修改字段类型、默认值、备注
alter table user modify column create_time varchar(11) default ‘0’ comment ‘创建时间’;
上面的 sql 命令代表修改 user 表的 create_time 字段类型为 varchar, 长度是11,默认值为字符0,备注创建时间。
2、修改字段名称
有些时候不需要修改字段的类型、默认值或备注,只需要对字段进行重命名,那命令如下:
alter table user change create_time build_date varchar(11) default ‘0’ comment ‘创建时间’;

改变表的列名
alter table stu RENAME TO student;

6.数据库索引

一、数据索引是干什么用的呢?

数据库索引其实就是为了使查询数据效率快。

二、数据库索引有哪些呢?

聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。
非聚集索引:就是给普通字段加上索引。
联合索引:就是好几个字段组成的索引,称为联合索引。

7.无法命中索引的几种情况

数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。

  1. like ‘%xx’
    select * from tb1 where name like=‘%cn’;
  2. 使用函数
    select * from tb1 where reverse(name) = ‘giao’;
  3. or
    select * from tb1 where nid = 1 or email = ‘seven@live.com’;
    –特别的:当or条件中有未建立索引的列才失效
    –以下会走索引
    select * from tb1 where nid = 1 or name = ‘seven’; --nid和name都是索引
    select * from tb1 where nid = 1 or email = ‘seven@live.com’ and name= ‘alex’
    –nid和name是索引,email不是,也会走索引
  4. 类型不一致
    如果列是字符串类型,传入的条件是必须是字符串,不然无法命中索引
    select * from tb1 where name = 999; --这里传的条件是整型,无法命中索引
  5. !=
    select * from tb1 where name != ‘alex’
    –特别的:如果是主键,则还是会走索引
    select * from tb1 where nid != 123
  6. select * from tb1 where name > ‘alex’
    –特别的:如果是主键或索引是整数类型,则还是会走索引
    select * from tb1 where nid > 123
    select * from tb1 where num > 123
    7.order by
    select email from tb1 order by name desc ;
    –当根据索引排序时候,选择的映射如果不是索引,则不走索引
    –特别的:如果对主键排序,则还是走索引:select * from tb1 order by nid desc;
    8.组合索引最左前缀
    如果组合索引为:(name,email)
    name and email – 使用索引
    name` – 使用索引
    条件只有email – 不使用索引

8.主键和唯一索引

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

唯一性索引列允许空值,而主键列不允许为空值。

主键列在创建时,已经默认为空值 + 唯一索引了。

主键可以被其他表引用为外键,而唯一索引不能。

一个表最多只能创建一个主键,但可以创建多个唯一索引。

主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

9.数据库事务的四大特性

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

mysql的四种隔离级别
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
1.Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
2.Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
3.Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
4.Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

以上是关于数据库相关内容的主要内容,如果未能解决你的问题,请参考以下文章

使用git和github进行协同开发流程

相关实体的 iOS 核心数据持久性

个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇

GORM数据服务VS Grails服务

值得永久收藏的 C# 设计模式套路

二维码和二维码内容是永久有效的吗?