数据库相关内容
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.无法命中索引的几种情况
数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。
- like ‘%xx’
select * from tb1 where name like=‘%cn’; - 使用函数
select * from tb1 where reverse(name) = ‘giao’; - 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不是,也会走索引 - 类型不一致
如果列是字符串类型,传入的条件是必须是字符串,不然无法命中索引
select * from tb1 where name = 999; --这里传的条件是整型,无法命中索引 - !=
select * from tb1 where name != ‘alex’
–特别的:如果是主键,则还是会走索引
select * from tb1 where nid != 123 -
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.主键和唯一索引
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
以上是关于数据库相关内容的主要内容,如果未能解决你的问题,请参考以下文章