MYSQL数据库面试题:
1、什么样的字段适合建索引
唯一、不为空、经常被查询的字段
2、索引类型有哪些?
主键索引、唯一索引、联合唯一索引、单列索引(普通索引)、多列索引
3、索引的优缺点?
优点:
可以加快查询的速度(包括表与表之间的连接、分组、排序)
缺点:
创建索引和维护索引需要耗费时间,而且也占用物理空间
当数据表修改、添加、删除的时候,都需要动态维护,降低了数据的维护速度
4、索引的原理?
mysql中innodb索引,采用的是B+树,如聚簇索引,是通过主键来聚集数据,采用B+树实现,
这即是一种索引,也是mysql的一种数据存储结构,叶子结点包含了所有的数据,非叶子结点仅起索引作用(若
没有定义主键,则innodb会隐式定义一个主键来作为聚簇索引)
5、索引的引擎Innodb和MyISAM的区别?
1)InnoDB支持事务支持行级别锁定;MyISAM不支持事务,支持表级别的锁定。
2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。
3)InnoDB支持外键,MyISAM不支持。
4)从MySQL5.5.5以后,InnoDB是默认引擎。
5)InnoDB在Mysq5.6之前是不支持全文索引,MyISAM是支持的
6)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。
7)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。MyisAM使用delete语句删除后并不会立刻清理磁盘空间,需要定时清理,命令:OPTIMIZE table dept;
8)Myisam创建表生成三个文件:.frm 数据表结构 、 .myd 数据文件 、 .myi 索引文件,Innodb只生成一个 .frm文件,数据存放在ibdata1.log
应用场景:
MyISAM不支持事务处理等高级功能,但它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
InnoDB用于需要事务处理的应用程序,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
6、在数据库中查询语句速度很慢,如何优化?
1.建索引
2.减少表之间的关联
3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面
4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
5.尽量用PreparedStatement来查询,不要用Statement
5、主键和外键的区别?
主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。
6、oracle分页查询语句
使用rownum,两种如下:
第一种:
select *
from (
select t.*,rownum row_num from mytable t
) b
where b.row_num between 1 and 10
第二种:
select *
from (
select a.*, rownum rn from mytable a where rownum <= 10
) where rn >= 1
使用rowid
7、怎么去重?
使用distinct去重
8、mysql常用操作函数
时间函数:
now()获取当前时间date+time
curdate()获取当前时间date
curtime()获取当前时间time
date_add(now(), interval 1/-1 day/hour/week/seconds)
date_sub和add一样
datediff(date1,date2)两个日期相减,返回天数
timediff(time1,time2)两个time相减,获取差值time
date_fromat格式化日期数据
字符串类函数
concat(str1,....,strn)将str1到strn以,连接一起
substring(str,x,y)从第x字符开始截取,截取y长度的字符串
substr(str from x for length)同上
group_concat()就是将查询到的某列,以,相连接在一起
lower(s)将字符串全部变成小写
uppper(s)将字符串全部变成大写
ltrim(s)/rtrim(s)/trime(s)去除左/右/两边空格
length(s)返回s的长度
数字类函数
ceil(n)向上取整
floor(n)向下取整
rand()返回0-1的随机数
roud(n,y)将n四舍五入并保留y位小数
truncate(n,y)将n保留y位小数
流程控制类:
if(v,t,f) if(1!=1,a,b)
case when v then t else f end
转换类型的:
cast(v as type)其中type可以是char、date等等
9、union和union all有什么不同?
union是回去重的
union all只是简单的拼接
10、oracle基本数据类型(了解)
1)字符串类型 char、nchar、varchar、varchar2、nvarchar2
2)数字类型 number、integer
3)浮点类型 binary_float、binary_double、float
4)日期类型 date、 timestamp
5)LOB类型 blob、clob、nclob、bfile
11、分页语句
mysql:limit 从第几页开始,多个个,从0开始
oracle:select * from (select r.*,rownum from im_user) temp where temp.rownum> and rownum <
12、存储过程、触发器的语法
存储过程:是一系列语句的综合,这个是主动调用的
create procedure 名称(in/out/inout 参数名 参数类型,..)
begin
declear c vachar(40);//声明参数以及类型
里面可以是if then else if then endif;流程类的
塞值表示set
end;
例如:
两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum
DROP PROCEDURE IF EXISTS `proc_adder`;
DELIMITER ;;
CREATE PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)
BEGIN
#Routine body goes here...
DECLARE c int;
if a is null then set a = 0;
end if;
if b is null then set b = 0;
end if;
set sum = a + b;
END;;
DELIMITER ;
触发器:在某个条件下出发的,自动
create trigger trigger_name
before/after [update/insert/delete]
on 表名
for each row
begin
[内容处理]
end;
Redis数据库面试题(nosql数据库,使用key-value存储):
1、什么是redis?redis的优缺点
Redis本质上是一个Key-Value类型的内存数据库,整个数据库加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
优点:
1、因为是纯内存操作,Redis的性能非常出色
2、Redis是支持保存多种数据结构
3、Redis也可以对存入的Key-Value设置expire时间
缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2、Redis支持哪几种数据类型?
string,list,set,hashes
3、Redis主要消耗什么物理资源
内存
4、Redis key的过期时间和永久有效分别怎么设置?
EXPIRE和PERSIST命令
5、redis是单线程吗?
redis是单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性的问题