Java面试题之数据库


前言

下面,我给大家总结下有哪些 数据库的面试题


一、mysql中char、varchar、text类型区别?

1、CHAR是一种固定长度的类型,适合存储很短或长度近似的属性,如性别、身份证号码、手机号码等字段。VARCHAR则是一种可变长度的类型,适合存储知道最大长度的可变的属性。 text不设置长度, 当不知道属性的最大长度时,适合用text。
2、查询速度比较: char最快, varchar次之,text最慢(字段完全填充的情况下,char查询效率比varchar高,不完全填充情况下,varchar比char查询效率高)
3、读取char类型数据时候时如果尾部有空格会丢失空格,varchar与text不会
4、char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,text最长能存64k。
5、5.0以上的mysql版本char与varchar中的n表示字符数

二、mysql常用存储引擎有哪些,有什么区别?

mysql常用存储引擎有InnoDB、MyISAM、Memory
1、InnoDB是mysql的默认引擎,支持事务,支持表级锁和行级锁,可以支持更高的并发,支持外键约束,支持自增长列,存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度
2、MyISAM曾是mysql的默认引擎,拥有较高的插入、查询速度,但不支持事务。
3、Memory是将数据直接存在内存中的,特别适合数据量小的表。插入、查询速度非常快,但是一旦服务器宕机,数据就会丢失。

二、数据库设计三范式指的是什么?

1、第一范式:强调的是列的原子性,即每一列都是不可再分的最小数据单元。
2、第二范式:满足第一范式,表必须有主键并且非主键的其他列必须完全依赖于全部主键而非部分主键。
3、第三范式:满足第二范式,非主键列必须直接依赖于主键,不能存在传递依赖。

三、怎么进行sql优化?

1.sql优化原则

最大化利用索引、尽可能避免全表扫描、减少无效数据的查询

2.select语句语法顺序

1. SELECT 
2. DISTINCT <select_list>
3. FROM <left_table>
4. <join_type> JOIN <right_table>
5. ON <join_condition>
6. WHERE <where_condition>
7. GROUP BY <group_by_list>
8. HAVING <having_condition>
9. ORDER BY <order_by_condition>
10.LIMIT <limit_number>

2.select语句执行顺序

FROM
<表名> # 选取表,将多个表数据通过笛卡尔积变成一个表。
ON
<筛选条件> # 对笛卡尔积的虚表进行筛选
JOIN <join, left join, right join...> 
<join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
WHERE
<where条件> # 对上述虚表进行筛选
GROUP BY
<分组条件> # 分组
<SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
HAVING
<分组筛选> # 对分组后的结果进行聚合筛选
SELECT
<返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
DISTINCT
# 数据除重
ORDER BY
<排序条件> # 排序
LIMIT
<行数限制>

3.索引的类别与应用场景

mysql中的索引分为PRIMARY(主键索引)、INDEX(普通索引)、UNIQUE(唯一索引)、FULLTEXT(全文索引)。通常单表数据十万以上的频繁查询的表考虑加索引,具体情况如下:
(1)主键自动建立唯一索引;
(2)频繁作为查询条件的字段应该创建索引;
(3)查询中与其他表有关联的字段,例如外键关系,应该创建索引;
(4)查询中统计或者分组的字段应该创建索引;
(5)查询中排序的字段创建索引;
(6)频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;
(7)表记录太少,不适合创建索引;
(8)数据重复且分布平均的字段,如性别不适合建索引

4.避免不走索引的场景

(1)尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描,尽量在字段后面使用模糊查询;
(2)尽量避免使用in 和not in,会导致引擎走全表扫描,如果是连续数值,可以用between代替,如果是子查询,可以用exists代替;
(3)尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描,可以用union代替or;
(4)尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描,可以给字段添加默认值0,对0值进行判断;
(5)尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描;
(6)当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描;
(7)查询条件不能用 <> 或者 !=;
(8)where条件仅包含复合索引非前置列;
(9)隐式类型转换造成不使用索引;
(10)order by 条件要与where中条件一致,否则order by不会利用索引进行排序;

5.SELECT语句其他优化

(1)避免出现select *
(2)避免出现不确定结果的函数。对于主从复制这类业务场景,使用如now()、rand()、sysdate()、current_user()等不确定结果的函数很容易导致主库与从库相应的数据不一致。
(3)多表关联查询时,小表在前,大表在后。
(4)使用表的别名。当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个列名上。
(5) 用where字句替换HAVING字句,HAVING中的条件一般用于聚合函数的过滤,除此之外,应该将条件写在where字句中。
(6)调整Where字句中的连接顺序。mysql采用从左往右,自上而下的顺序解析where子句。根据这个原理,应将过滤数据多的条件往前放,最快速度缩小结果集。

5.建表优化

(1)在表中建立索引,优先考虑where、order by使用到的字段。
(2)尽量使用数字型字段(如性别,男:1 女:2)
(3)用varchar/nvarchar 代替 char/nchar

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值