数据库相关内容

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 条件;

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.主键和唯一索引

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

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

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

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

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

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

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

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

程序员相关技术与动态 2020总结

调试过多线程的都会懂!

脏读相关

关于PHP中的请求上下文的相关知识

:服务注册是如何发起的

:服务注册是如何发起的