安装配置
【1】 MySQL安装配置教程(超级详细、保姆级)
【2】 MySQL+Navicat安装配置教程(超级详细、保姆级)
学习资料
【戴师兄】SQL入门免费教程
刷题链接:https://share.mubu.com/doc/4BHMMbbvIMb
学习笔记:https://share.mubu.com/doc/uf3vg8s5ar
【1】 零基础入门SQL - 知乎
学习笔记: https://mubu.com/doc/6M8yHBsz9lY
语法手册: 自学SQL网-金老师手册-打死也要记住法则
刷题链接:【入门】自学SQL网 / 菜鸟教程- 【进阶】牛客网 - 【参考手册】w3school
刷题答案(自学SQL网):【1】【2】
B站视频:【光头Mosh】
学习笔记:【1】
用法
最全版本
SELECT DISTINCT cxx, AGG_FUNC(cxx), AS xx
FROM xx AS xx
JOIN another_table
ON mytable.id = another_table.matching_id
WHERE xx is not null
GROUP BY cxx
HAVING group_exx
# UNION (+ 另一个SELECT语句)
ORDER BY cxx ASC/DESC
LIMIT vxx OFFSET vxx;
# cxx:列名column
# vxx:数值number
# exx:条件表达式constraint_expression
函数
-
distinct
:去重,删除的逻辑(而不是合并)。指定某个或某些属性列唯一返回。紧跟在SELECT之后写:SELECT DISTINCT column -
group by
:分组,合并。也会返回唯一的行,不过可以对具有相同的 属性值的行做一些统计计算,比如:求和、计数。 -
HAVING
:对分组之后的数据再做SELECT筛选 -
order by
columnASC/DESC
:排序,让结果按一个或多个属性列做 ASC升序 或 DESC 降序. -
LIMIT
xxxOFFSET
xxx:通常和ORDER BY 语句一起使用,对整个结果集排序之后,LIMIT指定只返回多少行结果,OFFSET指定从哪一行之后(不含)开始返回(limit 2 offset 2:3-4名)。(执行顺序靠最后) -
AS
:给 表 / 属性列 / 表达式 取一个别名,可以省略不写 -
COUNT
MIN
MAX
AVG
SUM
:聚合函数
JOIN:连接查询
-
(INNER) JOIN
,LEFT (OUTER) JOIN
,RIGHT (OUTER) JOIN
,FULL (OUTER) JOIN
,cross join
左连接: 左边为主表表数据全部显示, 匹配表的不匹配部分不显示;可以查询左表存在而右表为 null 的记录。
右连接: 右边为主表表数据全部显示, 匹配表的不匹配部分不显示;可以查询右表存在而左表为 null 的记录。
内连接: 只有两个元素表相匹配的才能在结果集中显示;两边都不可为 null。
全外连接: 连接中的不匹配的数据全部会显示出来
交叉连接: 笛卡尔乘积,显示的结果是连接表数的乘积
# 用INNER/LEFT/RIGHT/FULL JOINs 做多表查询
SELECT column1, column2, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_table
ON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column1, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
UNION:联合查询
-
UNION
运算符用于将两个或多个 SELECT 语句 的结果集合并成一个结果集,包括属于所有查询的所有行。
记住:UNION 中的每个 SELECT 语句必须具有相同的列数;列还必须具有相似的数据类型;每个 SELECT 语句中的列的顺序也必须相同。
SELECT column1, column2, column3
FROM table1
UNION
SELECT column1, column2, column3
FROM table2;
CASE WHEN … then … else … end
SELECT role,
case when building is not null
THEN "1" else "0" end
as Wheater,
count(name)
FROM employees
WHERE 1
GROUP BY role,Wheater;
NVL:空值转换
实现空值的转换。NVL(表达式A,表达式B)
如果表达式A为空值,NVL返回值为表达式B的值,否则返回表达式A的值。
DECODE:判断翻译 If / case when
【1】
sql 中 decode(…)函数的用法 —— 相当于 if 语句
将查询结果翻译成其他值(即以其他形式表现出来)。
Select decode(columnname,值1,翻译值1,值2,翻译值2,…值n,翻译值n,缺省值)
DECODE(value,if1,then1,if2,then2,if3,then3,…,else)
含义为
IF 条件=值1 THEN
RETURN(value 1)
ELSIF 条件=值2 THEN
RETURN(value 2)
…
ELSIF 条件=值n THEN
RETURN(value 3)
ELSE
RETURN(default)
END IF
## decode函数比较1个参数时:
SELECT ID,
DECODE(inParam,'byComparedParam','值1' ,'值2') name
FROM test_table;
#如果第一个参数 inParam == 'byComparedParam',
#则 select 得到的 name 显示为值1,
#如果第一个参数 inParam != 'byComparedParam',
#则 select 得到的 name 显示为值2
REPLACE:字符串替换
【1】
1、直接替换字符串中的部分字符:select REPLACE('abcdefghabc','abc','xxx')
输入的字符串为:abcdefghabc
结果为:xxxdefghxxx
2、替换一个字段中所有的部分字符:select city_name,REPLACE(city_name,'市','') as city from tmp_city
SUBSTR:字符串截取
【1】
SUBSTR(str,pos,len): 从pos开始的位置,截取len个字符
SUBSTR(str,pos): pos开始的位置,一直截取到最后。
pos要抽取的子串的起始下标,如果是负数,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。
CAST:数据类型的显式转换
【1】CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。
函数参数::CAST (expression AS data_type)
参数意义:expression
:任何有效的SQLServer表达式。AS
:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。data_type
:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
LPAD、RPAD:填充某个字段的查询结果
【1】,【2】
函数参数:lpad(string1, padded_length, [pad_string])
和rpad(string1, padded_length, [pad_string])
参数意义: string1
表示源字符串,padding_length
表示最后字符串的长度,[pad_string]
表示填充的内容
窗口函数
【1】 窗口函数的5种方法总结
- 聚合:sum,avg,max,min;
- 排名:row_number,rank,dense_rank;
- 切片:ntile,cume_dist,percent_rank
- 分组:grouping sets, grouping_id, cube, rollup
- 取前值或后值:lag,lead,first_value,last_value
E.g. 求连续三天登录
- 窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
- 1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
2) 聚合函数,如sum. avg, count, max, min等- 窗口函数有以下功能:
1)同时具有分组和排序的功能
2)不减少原表的行数
xxx over partition by xxx
cross join 交叉连接
A cross join B
A中每一行都与B中每一行进行连接
当left join 后不加on时,也能同样起到交叉连接的效果
select title, maxt.max_s-(Domestic_sales+International_sales)
from(SELECT *
FROM Movies m
left join Boxoffice b on m.Id = b.Movie_id)as mb
cross join
(SELECT Domestic_sales+International_sales as max_s
FROM Movies m
left join Boxoffice b on m.Id = b.Movie_id
order by Domestic_sales+International_sales DESC
limit 1)as maxt
select title, max1-each1
from(SELECT title, Domestic_sales+International_sales as each1
FROM Movies m
left join Boxoffice b on m.Id = b.Movie_id) as mb
cross join
(SELECT max(b.domestic_sales+b.international_sales)as max1
FROM movies m
left join boxoffice b ON m.id = b.movie_id)as maxt
区别
【DISTINCT】 - 【GROUP BY】
【HAVING】 - 【WHERE】
HAVING 和 WHERE 语法一样,只不过作用的结果集不一样. 在我们例子数据表数据量小的情况下可能感觉 HAVING没有什么用,但当你的数据量成千上万属性又很多时也许能帮上大忙 .
【JOIN】 - 【UNION】
【1】 Mysql join(连接查询) 与 union(联合查询) 的区别
- join(连接查询):是将两个查询(或表)的每一行,以“两两横同对接”的方式,
所得到的所有行的结果,即一个表中的某行,跟另一个表中的某行。
进行“横向对接”,得到一个新行。- union (联合查询):指将2个或2个以上的字段数量相同的查询结果,“纵向堆叠”后合并为一
【UNION】 - 【UNION ALL】
union会删掉重复的记录, union all不会
【TRUNCATE】 - 【DELETE】 - 【DROP】
(1)删除的对象:
- delete table: 删除内容, 不删除定义, 不释放空间。可以删除部分数据,也可以删除全部数据。
- truncate: 删除内容和定义,释放空间。
- drop 会删除表的结构,delete 和 truncate 只删除数据而不删除表的结构。
(2)回滚:
delete 是 DML 操作,可以触发器(Trigger)并可以回滚(rollback);
drop 和 truncate 是 DDL,不能进行回滚。
(3)速度:
速度来说,一般 drop > truncate > delete。
truncate等价于不带where的delete,删除所有表数据,速度比较快。
其他
关于NULLs
- 查找空元素:
where column1 IS NULL
- 查找非空元素:
where column1 IS NOT NULL
或者where column1
错题集
- 排序忘记指定 升序 / 降序
概念
事务(ACID) & 锁 & 隔离级别
事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
事务就是被绑在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就会失败,会回滚到之前的状态.要么全部执行,要么一个都不执行.
事务包含四大特性,即ACID。
DBMS中,锁是实现事务的关键。
- A:Atomicity 原子性。事务代码块是一个整体,要么都执行成功提交,要么全部失败回滚。
C:Consistency 一致性。数据库开始的全部状态与事务执行之后的状态保持一致。数据库总是从一个一致性的状态转换到另一个一致性的状态。
I:Isolation 隔离性。一事务与二事务互不影响。针对并发事务而言,要隔离并发运行的多个事务之间的影响,数据库提供了多种隔离级别。
D:Durability 持久性。事务的操作数据库造成持久化的影响。一旦事务提交成功,其修改就会永久保存到数据库中,此时即使系统崩溃,修改的数据也不会丢失。
隔离级别高的数据库的可靠性高,但并发量低,而隔离级别低的数据库可靠性低,但并发量高,系统开销小。Mysql隔离级别有以下四种(级别由低到高):
隔离级别 | 含义 | 效果 | 存在问题 |
---|---|---|---|
读未提交(RU) | 一个事务还没提交时,它做的变更就能被别的事务看到。(别的事务指同一时间进行的增删改查操作) | 事务中的修改,即使没有提交,其他事务也可以看得到。 | 事务可以读取其他事务修改完但未提交的数据,这种问题称为脏读。这个级别还存在不可重复读和幻读,很少使用。 |
读已提交(RC) | 一个事务提交(commit)之后,它做的变更才会被其他事务看到。 | 多数数据库的默认隔离级别(MySQL不是),这种隔离级别就是一个事务的开始,只能看到已经完成(提交)的事务的结果,正在执行的,是无法被其他事务看到的。 | 存在不可重复读,两次执行同样的查询可能会得到不同结果。 |
可重复读(RR) | 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 | MySQL默认的隔离级别,解决了脏读、不可重复读,保证同一个事务中多次读取同样的记录结果一致,InnoDB 通过 MVCC 解决。 | 无法解决幻读,幻读指当某个事务在读取某个范围内的记录时,会产生幻行。 |
串行化(S) | 正如物理书上写的,串行是单线路,顾名思义在MySQL中同一时刻只允许单个事务执行,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 | 最高的隔离级别,通过强制事务串行执行避免幻读。 | 在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题。实际很少使用,只有非常需要确保数据一致性时考虑。 |
- 脏写(Dirty Write) 脏写是指一个事务修改了其它事务未提交的数据。
- 脏读(Dirty Read) 脏读是指一个事务读到了其它事务未提交的数据。
- 不可重复读(Non-Repeatable Read) 不可重复读指的是在一个事务执行过程中,读取到其它事务已提交的数据,导致两次读取的结果不一致。
- 幻读(Phantom) 幻读是指的是在一个事务执行过程中,读取到了其他事务新插入数据,导致两次读取的结果不一致。
事务并发访问同一数据资源的情况主要就分为读-读、写-写和读-写三种。
- 读-读 即并发事务同时访问同一行数据记录。由于两个事务都进行只读操作,不会对记录造成任何影响,因此并发读完全允许。
- 写-写 即并发事务同时修改同一行数据记录。这种情况下可能导致脏写问题,这是任何情况下都不允许发生的,因此只能通过加锁实现,也就是当一个事务需要对某行记录进行修改时,首先会先给这条记录加锁,如果加锁成功则继续执行,否则就排队等待,事务执行完成或回滚会自动释放锁。
- 读-写 即一个事务进行读取操作,另一个进行写入操作。这种情况下可能会产生脏读、不可重复读、幻读。最好的方案是读操作利用多版本并发控制(MVCC),写操作进行加锁。
锁的粒度
按锁作用的数据范围进行分类的话,锁可以分为行级锁和表级锁。
- 行级锁:作用在数据行上,锁的粒度比较小。
- 表级锁:作用在整张数据表上,锁的粒度比较大。
锁的分类
为了实现读-读之间不受影响,并且写-写、读-写之间能够相互阻塞,Mysql使用了读写锁的思路进行实现,具体来说就是分为了共享锁和排它锁:
- 共享锁(Shared Locks):简称S锁,在事务要读取一条记录时,需要先获取该记录的S锁。S锁可以在同一时刻被多个事务同时持有。我们可以用select … lock in share mode;的方式手工加上一把S锁。
- 排他锁(Exclusive Locks):简称X锁,在事务要改动一条记录时,需要先获取该记录的X锁。X锁在同一时刻最多只能被一个事务持有。X锁的加锁方式有两种,第一种是自动加锁,在对数据进行增删改的时候,都会默认加上一个X锁。还有一种是手工加锁,我们用一个FOR UPDATE给一行数据加上一个X锁。
还需要注意的一点是,如果一个事务已经持有了某行记录的S锁,另一个事务是无法为这行记录加上X锁的,反之亦然。
除了共享锁(Shared Locks)和排他锁(Exclusive Locks),Mysql还有意向锁(Intention Locks)。意向锁是由数据库自己维护的,一般来说,当我们给一行数据加上共享锁之前,数据库会自动在这张表上面加一个意向共享锁(IS锁);当我们给一行数据加上排他锁之前,数据库会自动在这张表上面加一个意向排他锁(IX锁)。意向锁可以认为是S锁和X锁在数据表上的标识,通过意向锁可以快速判断表中是否有记录被上锁,从而避免通过遍历的方式来查看表中有没有记录被上锁,提升加锁效率。例如,我们要加表级别的X锁,这时候数据表里面如果存在行级别的X锁或者S锁的,加锁就会失败,此时直接根据意向锁就能知道这张表是否有行级别的X锁或者S锁。
关系型 & 非关系型 数据库
Q:区别?
A:
- 数据存储方式:关系型数据库采用关系模型来存储数据,非关系型数据库则采用键值对、文档、表格等形式来存储数据。
- 查询语言:关系型数据库使用 SQL 查询语言,非关系型数据库则使用不同的查询语言或语法,例如 MongoDB 的查询语言、CouchDB 的 MapReduce 函数式查询等。
- 数据一致性:关系型数据库保证数据一致性,而非关系型数据库则通常不保证数据一致性。
- 数据结构:关系型数据库的数据结构简单,非关系型数据库的数据结构更加灵活。
- 并发控制:关系型数据库采用锁机制实现并发控制,而非关系型数据库则通常不提供并发控制机制。
关系型 | 非关系型 | |
---|---|---|
举例 | Mysql、Oracle 数据库 (甲骨文) Sql Server、Access 数据库 (微软) DB2数据库 (IBM) OceanBase数据库(阿里巴巴) |
键值存储数据库:Redis、Memcached 文档存储数据库:MongoDB、CouchDB 列存储数据库:HBase 图数据库:Neo4j |
特性 | 1、采用了关系模型来组织数据; 2、最大特点是事务的一致性; 3、简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 |
1、使用键值对存储数据; 2、分布式; 3、一般不支持ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 |
优点 | 1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 |
1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key - value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 |
缺点 | 1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、高并发读写需求; 4、海量数据的高效率读写; |
1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好; |
应用 | 适合存储结构化数据,比如:用户的账号、地址: (1)这些数据通常需要做结构化查询,比如说Join,这个时候,关系型数据库就要胜出一筹。 (2)这些数据的规模、增长的速度通常是可以预期的。 (3)事务性、一致性,适合存储比较复杂的数据。 |
适合存储非结构化数据,比如:文章、评论: (1)这些数据通常用于模糊处理,例如全文搜索、机器学习,适合存储较为简单的数据。 (2)这些数据是海量的,并且增长的速度是难以预期的。 (3)按照key获取数据效率很高,但是对于join或其他结构化查询的支持就比较差。 |
索引
Q:索引的作用?优点缺点是什么?
索引就是一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索.类似于现实生活中的目录.不需要查找整本书就可以找到想要的结果.
优点:
1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
缺点:
1)索引需要占用数据表以外的物理存储空间。
2)创建索引和维护索引要花费一定的时间。
3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
Q:什么样的字段适合建立索引?什么情况适合创建索引?索引建立的规范?
唯一,不为空, 经常被查询的字段
.
(1)在经常需要搜索的列上,可以加快搜索的速度;
(2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
(3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
(4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
(5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
(6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度
.
控制数量:索引越多代价越高,对于 DML 频繁的表,索引过多会导致很高的维护代价。
使用短索引:假如构成索引的字段长度比较短,那么在储块内就可以存储更多的索引,提升访问索引的 IO 效率。
建立索引:对查询频次较高且数据量比较大的表建立索引。如果 WHERE 子句中的组合比较多,应当挑选最常用、过滤效果最好的列的组合。业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
使用前缀索引:对于 BLOB、TEXT 或很长的 VARCHAR 列必须使用前缀索引,MySQL 不允许索引这些列的完整长度。
合适的索引顺序:当不需要考虑排序和分组时,将选择性最高的列放在前面。索引的选择性是指不重复的索引值和数据表的记录总数之比,索引的选择性越高则查询效率越高。
删除重复索引:MySQL 允许在相同列上创建多个索引,重复索引需要单独维护。
Q:索引的类型有哪些?
逻辑上:单行索引,多行索引,唯一索引,非唯一索引,函数索引,域索引.
物理上:分区索引, 非分区索引
B-tree:正常性B树;反转型B树;bitmap位图索引;散列索引
- B-Tree:大多数引擎都支持这种索引,但底层使用不同结构,例如 NDB 使用 T-Tree,InnoDB 使用 B+ Tree。所有的值都是顺序存储的,并且每个叶子页到根的距离相同。B-Tree 索引能够加快访问数据的速度,存储引擎不再需要进行全表扫描来获取数据,而是从索引的根节点开始搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。叶子节点的指针指向的是被索引的数据,而不是其他节点页。
- Hash: 哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,索引自身只需存储对应的哈希值,所以索引结构十分紧凑,这让哈希索引的速度非常快。
- 空间索引:MyISAM 的一个特殊索引类型,用作地理数据存储。
- 全文索引:MyISAM 的一个特殊的 B-Tree 索引,一共有两层。第一层是所有关键字,然后对于每一个关键字的第二层,包含的是一组相关的文档指针。用于通过关键字匹配进行查询。
Q: 具有索引 & 没有索引
- 具有索引的数据库:MySQL、PostgreSQL、MongoDB、CouchDB
索引类型包括 B-Tree、哈希、全文等。- 不具有索引的数据库:
Redis:Redis 中的数据以键值对形式存储,不支持索引。
MongoDB:MongoDB 中的文档结构中不允许存在重复字段,因此不支持哈希索引。
Neo4j:Neo4j 中的数据以图形形式存储,不支持索引。
Q: 主键 & 外键
主键在本表中是唯一的,不为空的, 外键可以重复和为空.
外键和另外一张表相关联, 不能创建对应表中不存在的外键.
Q: 唯一性索引 & 主键索引
唯一性索引create unique index stusno on student(sno);表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。
.
主键索引:其值唯一标识表中的每一行。该列称为表的主键。主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
Q: 聚集索引 & 非聚集索引的区别
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。
- 聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。
非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。- 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续
Q:聚簇索引是什么?
聚簇索引不是一种索引类型,而是一种数据存储方式。InnoDB 的聚簇索引实际上在同一个结构中保存了 B 树索引和数据行。当表有聚簇索引时,它的行数据实际上存放在索引的叶子页中,由于无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
优点:可以把相关数据保存在一起;将索引和数据保存在同一个 B 树中,获取数据比非聚簇索引要更快。
缺点:如果数据全部在内存中会失去优势;更新代价高,强制每个被更新的行移动到新位置;插入行或主键更新时,可能导致页分裂,占用更多磁盘空间。
Q:索引失效的情况?
① 隐式类型转换,常见情况是在 SQL 的 WHERE 条件中字段类型为字符串,其值为数值,如果没有加引号那么 MySQL 不会使用索引。
② 如果条件中 OR 只有部分列使用了索引,索引会失效。
③ 执行 LIKE 操作时,最左匹配会被转换为比较操作,但如果以通配符开头,存储引擎就无法做比较,索引失效
④ 如果查询中的列不是独立的,则 MySQL 不会使用索引。独立的列是指索引列不能是表达式的一部分,也不能是函数的参数。
⑤ 对于多个范围条件查询,MySQL 无法使用第一个范围列后面的其他索引列,对于多个等值查询则没有这种限制。
⑥ 如果 MySQL 判断全表扫描比使用索引查询更快,则不会使用索引。
范式 & 约束
【1】 Mysql - 什么是三大范式(通俗详解)
范式是符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。是数据库设计规范,范式越高则数据库冗余越小,但查询也更复杂,一般只需满足第三范式。
- 第一范式 1NF: 列不可再分;每个关系r的属性值为不可分的原子值。
- 第二范式 2NF: 行可以唯一区分,主键约束;在第一范式的基础上消除部分依赖,非主键列完全依赖于主键列(非主属性完全函数依赖于候选键,左部不可约)。
- 第三范式 3NF: 表的非主属性不能依赖其他表的非主属性外键约束;在第二范式的基础上消除传递依赖,非主键列只依赖于主键列(消除非主属性对候选键的传递依赖)。
- BCNF:满足3NF,消除每一属性对候选键的传递依赖。
约束是在表中定义的用于维护数据库完整性的一些规则。
1、主键约束:唯一性,非空性
2、唯一约束:唯一性,可以空,但只能有一个。
3、检查约束:对该列数据的范围、格式的限制(如:年龄、性别等)
4、默认约束:该数据的默认值
5、外键约束:需要建立两表间的关系并引用主表的列
触发器(事前触发 / 事后触发、语句级触发 / 行级触发)
触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动。使用触发器可以用来保证数据的有效性和完整性。
事前触发发生在事件发生之前,用于验证一些条件或进行一些准备工作;事后触发发生在事件发生之后,做收尾工作。事前触发可以获得之前和新的字段值,而事后触发可以保证事务的完整性。
语句级触发可以在语句执行之前或之后执行,而行级触发在触发器所影响的每一行触发一次。
存储过程
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常
Q:什么是存储过程? 用什么来调用?
存储过程是一个预编译的SQL语句,允许模块化的设计,只需要创建一次,就可以被多次调用。
如果需要执行多次SQL,那么存储过程的速度更快.可以用命令对象来调用存储过程.可以供外部程序调用,如java程序
Q:存储过程的优缺点?
优点:存储过程是一个预编译的SQL语句,执行效率高;放在数据库中,直接调用,减少网络通信;安全性高;可重复使用。
缺点: 移植性差
Q:存储过程与函数的区别?
存储过程:在数据库中完成指定的增删改查操作
申明:procedure
函数:在编程语言中进行任务的处理
申明:function
语句类型
SQL语句类型:DDL、DML、DCL、TCL (前三种常见)
Q: oracle语句有多少类型?
DDL(Data Definition Language,数据定义语言):
create, drop, alter, rename, truncate
。建表,建数据库,建立约束,修改约束,权限修改。
DML(Data Manipulation Language,数据操纵语言):insert, update, delete
。增、删、改。
DCL(Data Control Language,数据控制语言):grant, revoke
。管理用户权限,比如常见的授权、取消授权、回滚、提交等等操作。
.
TCL(Transaction Control Language事务控制语言):commit, rollback, savepoint
。TCL也可以归类于DCL中,因为他们两者都是属于控制语言。
DQL(Data Query Language,数据查询语言):用来进行数据库中数据的查询的,即最常用的select语句。
视图
视图就是一种虚拟的表,具有和物理表相同的功能。是存储在数据库中的查询 SQL 语句,可以对视图进行增改查等操作,视图通常是一个表或多个表的行或列的子集。
视图只是一个逻辑,具体结果在引用视图时动态生成。
Q:表和视图的关系?
视图其实就是一条查询语句,用于显示一个或多个表或其他视图中的数据,
表就是关系型数据库中实际存储数据用的.
Q:视图的优缺点?
优点:
对数据的选择性访问,用户可以通过简单的查询从复杂查询中得到结果
维护数据的独立性,对相同的数据产生不同的视图
① 具有安全性,可以进行权限控制,创建只读视图,公开给特定用户。
② 可以简化复杂的查询,保存其逻辑。
.
缺点: 性能
游标
- 游标是遍历结果集的一个指针, 用来逐条处理数据
- 游标提供了一种对从表中检索出的数据进行操作的灵活手段,它实际上是一种能从包含多条数据记录的结果集中每次提取一条记录的机制。
- 游标是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
连接池
【1】 数据库连接池学习笔记(一):原理介绍+常用连接池介绍
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
Q:数据库连接池的作用?
- 在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法,如外部使用者可通过getConnection方法获取数据库连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时的连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。
- 资源重用,由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。
- 对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
并发访问和检索
Q:大数据高并发情况下怎么从数据库设计和软件应用程序上来改善?
(1)用多台服务器来分库支撑高并发读写
- 数据库服务器采用集群方式部署(比如Oracle的一个数据库多个实例的情况)
- WEB应用和数据库部署在各自独立的服务器上
.(2)大量分表来保证海量数据下的查询性能
- 数据库垂直分割
- 数据库水平分割
.(3)读写分离来支撑按需扩容以及性能提升
- 数据库采用主从设计方式。将数据库的读写操作分离。
Q:如何处理银行的高并发业务?(特点:体量大,高并发,无规律)客户办理业务的机子卡咋回事?
核心一个是短,一个是少,一个是分流,最后一个是集群/横向扩张/读写分离/建立主从。
短:
(1)使用缓存-第一次获取数据从数据库准提取,然后保存在缓存中,以后就可以直接从缓存提取数据。不过需要有机制维持缓存和数据库的一致性。
(2)使用储存过程-那些处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了。
(3)批量读取 - 高并发情况下,可以把多个请求的查询合并到一次进行,以减少数据库的访问次数
(4)延迟修改 - 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中,风险是可能会断电丢失缓存中的数据。
(5)使用索引 - 索引可以看作是特殊的缓存,尽量使用索引就要求where字句中精确的给出索引列的值。
.
少:指查询的数据要少:
(1)分表 - 把本来同一张表的内容,可以按照地区,类别等分成多张表,很简单的一个思路,但是要尽量避免分出来的多表关联查询。
(2)分离活跃数据 - 例如登录用户业务,注册用户很多,但是活跃的登录用户很少,可以把活跃用户专门保存一张表,查询是先查询活跃表,没有的话再查总表,这也类似与缓存啦。
(3)分块 - 数据库层面的优化,对程序是透明的,查询大数据只用找到相应块就行。
.
分流:
(1)集群 - 将并发请求分配到不同的服务器上,可以是业务服务器,也可以是数据库服务器。
(2)分布式 - 分布式是把单次请求的多项业务逻辑分配到多个服务器上,这样可以同步处理很多逻辑,一般使用与特别复杂的业务请求。
(3)CDN - 在域名解析层面的分流,例如将华南地区的用户请求分配到华南的服务器,华中地区的用户请求分配到华中的服务器。
读写分离、主从复制
- 读写分离:
为保证数据库数据的一致性,我们要求所有对于数据库的更新操作都是针对主数据库的,但是读操作是可以针对从数据库来进行。大多数站点的数据库读操作比写操作更加密集,而且查询条件相对复杂,数据库的大部分性能消耗在查询操作上了。 - 主从复制:
数据是异步完成的,这就导致主从数据库中的数据有一定的延迟,在读写分离的设计中必须要考虑这一点。以博客为例,用户登录后发表了一篇文章,他需要马上看到自己的文章,但是对于其它用户来讲可以允许延迟一段时间(1分钟/5分钟/30分钟),不会造成什么问题。这时对于当前用户就需要读主数据库,对于其他访问量更大的外部用户就可以读从数据库。
分库 & 分表
【1】 分库分表面试题及答案
数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的。
分表是啥意思?就是把一个表的数据放到多个表中,然后查询的时候你就查一个表。比如按照用户 id 来分表,将一个用户的数据就放在一个表中。然后操作的时候你对一个用户就操作那个表就好了。
分库是啥意思?就是你一个库一般我们经验而言,最多支撑到并发 2000,一定要扩容了,而且一个健康的单库并发值你最好保持在每秒 1000 左右,不要太大。那么你可以将一个库的数据拆分到多个库中,访问的时候就访问一个库好了
两种分库分表的方式:
(1)按照 range 来分,就是每个库一段连续的数据,这个一般是按比如时间范围来的,但是这种一般较少用,因为很容易产生热点问题,大量的流量都打在最新的数据上了。
(2)按照某个字段 hash 一下均匀分散,这个较为常用。
存储引擎
- InnoDB
① MySQL5.1 开始的默认引擎,最大的优点是支持事务和外键,InnoDB 的性能和自动崩溃恢复特性使它在非事务型需求中也很流行,一般应该优先考虑使用 InnoDB。
② 底层存储结构是 B+ 树,每个节点都对应 InnoDB 的一个页。非叶子节点只有 key 值,叶子节点包含完整的数据。
③ 支持行锁,采用 MVCC 支持高并发,实现了四个标准的隔离级别,默认级别是可重复读,通过间隙锁防止幻读。
④ 基于聚簇索引,对主键查询有很高的性能。
⑤ 内部做了很多优化,例如加速读操作的自适应哈希索引、加速插入操作的缓冲区等。 - MyISAM
① MySQL5.1及之前的默认引擎,提供的特性包括全文索引、空间索引等,不支持事务、行锁和外键。
② 最大的缺陷是崩溃后无法恢复,在插入和更新数据时需要锁定整张表,效率低。
③ 对于只读的数据或者表比较小、可以忍受修复操作的情况可以使用 MyISAM。 - Memory
① 如果需要快速访问数据且这些数据不会被修改,重启以后丢失也没有关系,可以使用 Memory 表。
② 数据保存在内存,不需要磁盘 IO,表的结构在重启后会保留,数据会丢失。
③ 支持哈希索引,查找速度快。
④ 使用表锁,并发性能低。
MVCC(多版本并发控制,Multi-Version Concurrency Control)
【1】 MVCC你了解多少?- 阿里云
【2】 一文读懂MVCC:数据库中的并发读写利器!
WAL(预写日志,Write Ahead Log)
【1】 【存储】什么是 WAL | 数据库性能
数据库的设计
Q:如何设计一个数据库?
关系数据库设计有需求分析设计、概念设计、逻辑设计、物理设计、系统实施、运行维护等六个阶段:
(1)需求分析:分析用户的需求,包括数据、功能和性能需求。
(2)概念结构设计:主要采用E-R模型进行,包括画E-R图。
(3)逻辑结构设计:通过将E-R图转换为表,实现E-R模型到关系模型的转化。
(4)数据库物理设计:主要是为设计的数据库选择合适的存储路径和存储结构。
(5)数据库的实施:包括编程、测试和运行。
(6)数据库运行与维护:系统的运行和数据库的日常维护。
在需求分析设计阶段形成需求说明书,
概念设计阶段形成概念数据模型(作为进一步设计数据库的依据),
逻辑设计阶段形成逻辑数据模型(从ER图向关系模式转换、关系视图设计、模式规范化),
物理设计阶段形成数据库同步模型(此时涉及具体软硬件环境)。
Oracle
Q:oracle基本数据类型
字符串 char nchar varchar varchar2 nvarchar2
数字 number integer
浮点 binary_float binary_double float
日期时间 date timestamp
字符块 blob clob nclob bfile
Q:varchar2和varchar有什么区别?
varchar2是Oracle自己开发的, 目前varchar2和varchar是同义词,关键点是varchar是可变长度的,可以根据实际的长度来存储
Q:MySQL & Oracle 的区别
详见【1】 【2】。两者都是关系型数据库,mysql开源免费的,而oracle则是收费的,并且价格非常高。mysql属于轻量型数据库;oracle属于重量型数据库。
- 管理机制不同 —— Oracle通过表空间来管理磁盘空间的分配和释放,而MySQL则使用文件系统管理数据库中的对象数据,它们有不同的机制来处理磁盘空间的分配问题。与Oracle相比,MySQL没有表空间,角色管理,快照,同义词和包以及自动存储管理。
- 库函数不同 —— 数学函数(Oracle则有专门提供针对分数和小数运算的函数)、字符串函数(MySQL还具有一些其他的高级字符串函数,如FIELD、REPLACE、SUBSTRING_INDEX)、时间和日期函数(Oracle可能具有更强大和灵活的日期功能,比如时区转换)、其他:MySQL有几个非常特殊且是该数据库所独有的函数,例如SLEEP函数(在指定的秒数后停止执行)和UUID函数(生成唯一性标识符)。Oracle则有更高级的分析函数和带有设备输入输出等 I / O 操作的特殊处理函数。
- SQL语句不同 —— 字符串连接(MySQL使用“CONCAT”函数;Oracle使用横杠 || 操作符)、子查询(MySQL中,一个SELECT语句可以用于子查询;Oracle允许包含多个SELECT语句的子查询。)
- 分页查询不同 —— MySQL是直接在SQL语句中写"select… from …where…limit x, y",有limit就可以实现分页;Oracle则是需要用到伪列ROWNUM和嵌套查询
Q:什么是PL/SQL?
PL/SQL是一种程序语言,叫做过程化SQL语言,PL/SQL是对oracle数据库对SQL语句的扩展. 在普通的SQL语句的使用上增加了编程语言的特点.通过逻辑判断,循环等操作来实现复杂的功能或者计算.
PL/SQL只有Oracle数据库有, mySQL现在不支持PL/SQL
Q:commit在哪里会运用?
Oracle的commit就是DML语句提交数据.在未提交之前你的操作都是保存在内存中,没有更新到物理内存中.执行commit从用户角度来讲就是更新到物理文件了.事实上commit还写入了日志文件
Q:序列的作用?
Oracle使用序列来生成唯一的编号, 用来处理一个表中的自增字段.
函数(包)
Q:oracle的分页查询语句?
A:select * from table where row_num
between 1 and 10
Q:oracle如何去重?
A:使用distinct
关键字
【1】 oracle使用DBMS_RANDOM
包生成随机数据
【2】 Oracle中to_char()
函数的用法
Q:oracle获取系统时间?
A:select to_char(sysdate,"yyyy-MM-dd") from dual
Redis
Q:Redis的5种数据类型
① string(字符串)
② hash(哈希)
③ list(列表)
④ set(集合)
⑤ zset (sorted set:有序集合)
可以使用 type 查看键的数据结构,包括:string、hash、list、set、zset,这些是 Redis 对外的数据结构。实际上每种数据结构都有底层的内部编码,Redis 根据场景选择合适的内部编码,可以使用 object encoding 查看。
1)string
- 概念:键是字符串,值可以是字符串(JSON,XML)、数字(整形、浮点数)、二进制(图片、音频、视频),最大不超过 512 MB。
- 命令:set、get、setex、setnx、mset、mget、incr、decr。
- 内部编码:① int(< 8B)。② embstr(不大于 39 字节)。③ raw(大于 39 字节)。
- 应用场景:
① 缓存:Redis 作为缓存,MySQL 作为存储层,首先从 Redis 获取数据,如果失败就从 MySQL 获取并将结果写回 Redis 并添加过期时间。
② 计数:Redis 可以实现快速计数功能,例如视频每播放一次就用 incr 把播放数加 1。
③ 共享 Session:一个分布式 Web 服务将用户的 Session 信息保存在各自服务器,但会造成一个问题,出于负载均衡的考虑,分布式服务会将用户的访问负载到不同服务器上,用户刷新一次可能会发现需要重新登陆。为解决该问题,可以使用 Redis 将用户的 Session 进行集中管理,每次用户更新或查询登录信息都直接从 Redis 获取。
2)hash
- 概念:键值本身又是一个键值对结构,哈希类型中的映射关系叫 field-value, value 是指 field 对应的值而不是键对应的值。
- 命令:hset、hget、hdel、hlen、hexists。
- 内部编码:① ziplist(field <= 512 且 value <= 64B)。② hashtable(field > 512 或 value > 64B)。
3)list
- 概念:存储多个有序字符串,每个字符串称为元素,一个列表最多可以存储 232-1 个元素。可以对列表两端插入和弹出,还可以获取指定范围的元素列表、获取指定索引的元素等。列表是一种比较灵活的数据结构,可以充当栈和队列,在实际开发中有很多应用场景。list 有两个特点:① 元素有序,可以通过索引获取某个元素或某个范围的元素。② 元素可以重复。
- 命令:lpush、rpop、lrange、lindex、llen。
- 内部编码:① ziplist(key <= 512 且 value <= 64B)。② linkedlist(key > 512 或 value > 64B)。③ quicklist。
- 应用场景:lpush + lpop = 栈、lpush + rpop = 队列、lpush + ltrim = 优先集合、lpush + brpop = 消息队列。
4)set
- 概念:保存多个字符串元素,和 list 不同的是集合不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合最多可以存储 232-1 个元素。Redis 除了支持集合内的增删改查,还支持多个集合取交集、并集、差集。
- 命令:sadd、sremove、scard、sismember、spop。
- 内部编码包括:① intset(key <= 512 且 element 是整数)。② hashtable(key > 512 或 element 不是整数)。
- 应用场景:sadd = 标签、spop = 生成随机数,比如抽奖、sinter = 社交需求。
5)zset
- 概念:有序集合保留了集合不能有重复成员的特性,不同的是可以排序。但是它和 list 使用索引下标作为排序依据不同的是,他给每个元素设置一个分数(score)作为排序的依据。有序集合提供了获取指定分数和元素查询范围、计算成员排名等功能。
- 命令:zadd、zremove、zscore、zrank、zcount。
- 内部编码:① ziplist(key <= 128 且 member <= 64B)。② skiplist(key > 128 或 member > 64B)。
- 应用场景:有序集合的典型使用场景就是排行榜系统,例如用户上传了一个视频并获得了赞,可以使用 zadd 和 zincrby。如果需要将用户从榜单删除,可以使用 zrem。如果要展示获取赞数最多的十个用户,可以使用 zrange。
Q:Redis的3种集群方式
主从复制
哨兵模式
Cluster模式
Q:分布式缓存系统有哪些?
常见的系统有:
(1)Memcached 是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的 Hash 表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
(2)Redis 是一个远程内存数据库(非关系型数据库),性能强劲,具有复制特性以及解决问题而生的独一无二的数据模型。
Q:怎么实现数据的一致性?
缓存和数据库不一致,主要是因为网络不稳定或节点故障导致
.
【1】 学习Redis之三种缓存策略
法一:CAP (cache aside pattern,旁路缓存模式)
1.请求先查缓存,缓存没有去数据库查,查到之后添加到缓存;
2.数据更新,先更新数据库,然后删除相应的缓存;
法二:Read/Write Through Pattern(读写穿透)
法三:Write Behind Pattern(异步缓存写入)
Q:Redis快速的原理?
(1)纯内存操作
(2)单线程操作,避免了频繁的上下文切换
(3)采用了非阻塞I/O多路复用机制
Q:redis作缓存可能会出现的问题?以及解决方案?
【1】 十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩
(1)缓存穿透:要访问的数据在数据库中不存在,因此也不会被加到缓存中,因此每次访问都要去数据库中查找数据;
解决:将不存在的数据也加到缓存中,设置一个较短的过期时间;将一些不可能存在的数据提前过滤掉;
(2)缓存雪崩 :缓存中的数据在同一时间段集体过期:可能是缓存服务器宕机,大量请求直接访问数据库
解决:设置多级缓存,缓存和缓存的拷贝;设置mutex锁,控制访问数据库写缓存为单线程;根据不同点设置不同的缓存过期时间,热点数据缓存时间长,冷门数据缓存时间短;缓存预热;
(3)缓存击穿:过于热点的数据,在缓存过期的瞬间,数据库会被过量访问,导致不可用。
解决:可以设置缓存永不过期;
(4)缓存的并发竞争问题
缓存过期策略:定时删除+定期删除。
缓存淘汰策略:FIFO,LRU,LFU
Q:缓存优化方案?什么是缓存?
缓存优化思路:在redis之前加一层过滤,先在海量订单号中快速判断是否存在该订单号,如果存在再去redis中查找,如果redis中找不到就去数据库中查找。即布隆过滤器。
.
缓存主要是避免页面和数据库进行多次的交互。一个网站特别大的话 访问量也特别大 每进来一个用户我都要去数据库执行各种语句 可见这样造成的后果是多么的严重 如果把数据库常用的数据都加载到缓存中 那么用户每次访问数据就可以直接从缓存中读取了 这样会大大提高数据的效率 而且还能提高网站的效率 有助有高并发。
Spark
Map操作
在Spark中,map操作是一种数据转换函数,它将一个RDD(弹性分布式数据集)中的每个元素应用到一个给定的函数上,返回一个新的RDD。通俗的说,可以把map操作看作是对RDD中的每个元素都执行同样的操作,这个操作是由用户自定义的函数来完成的。
举个例子,假设有一个包含数字的RDD,现在我们想要将每个数字都平方,并得到一个新的RDD。那么我们就可以使用map操作来实现:
# 创建一个原始的RDD
data = [1, 2, 3, 4, 5]
rdd = sc.parallelize(data)
# 使用map操作将每个数字都平方
squared_rdd = rdd.map(lambda x: x ** 2)
# 打印新的RDD中的元素
print(squared_rdd.collect())
输出结果为:[1, 4, 9, 16, 25],表示每个数字都被平方了。
在这个例子中,我们使用了Python中的lambda函数来定义每个数字如何被平方。当调用map()方法时,Spark会将这个函数应用到RDD的每个元素上,最后返回一个新的RDD。这个新的RDD中每个元素都是原始RDD中的元素经过用户自定义函数计算后得到的结果。
RDD
RDD (Resilient Distributed Dataset, 弹性分布式数据集) 是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
- 它是一组分区,分区是spark中数据集的最小单位。也就是说spark当中数据是以分区为单位存储的,不同的分区被存储在不同的节点上。这也是分布式计算的基础。
- 一个应用在各个分区上的计算任务。在spark当中数据和执行的操作是分开的,并且spark基于懒计算的机制,也就是在真正触发计算的行动操作出现之前,spark会存储起来对哪些数据执行哪些计算。数据和计算之间的映射关系就存储在RDD中。
- RDD之间的依赖关系,RDD之间存在转化关系,一个RDD可以通过转化操作转化成其他RDD,这些转化操作都会被记录下来。当部分数据丢失的时候,spark可以通过记录的依赖关系重新计算丢失部分的数据,而不是重新计算所有数据。
- 一个分区的方法,也就是计算分区的函数。spark当中支持基于hash的hash分区方法和基于范围的range分区方法。
- 一个列表,存储的是存储每个分区的优先存储的位置。
通过以上五点,我们可以看出spark一个重要的理念。即移动数据不如移动计算,也就是说在spark运行调度的时候,会倾向于将计算分发到节点,而不是将节点的数据搜集起来计算。RDD正是基于这一理念而生的,它做的也正是这样的事情
- Narrow / Wide Transformations 指的是一种对RDD进行转换的方法。
Narrow Transformations只涉及到一个父RDD和一个子RDD之间的转换,可以处理相对较小的数据集。
Wide Transformations 则通常涉及多个父RDD的操作,在处理大数据集时更有价值。 - Narrow Transformations比Wide Transformations更高效,并且在处理较小数据集时具有优势。因为 使用Narrow Transformations时,子RDD只需要从其父RDD获取数据即可完成计算,因此不需要重新分区或混洗数据。
- 以下是几种常用的Narrow Transformations:
map(): 对每个元素应用函数并返回新的RDD
filter(): 返回一个只包含通过条件测试的元素的RDD
union(): 将两个RDD组合成一个RDD
intersection(): 返回同时存在于两个RDD中的元素的RDD
distinct(): 返回一个仅包含不同元素的新RDD
groupByKey(): 将具有相同键的元素分组到一起
reduceByKey(): 根据键将每个值减少到单个值
面试题目
SQL
【Q】:E-R图三要素?
【A】:实体(表),属性(表中的字段),联系(表与表之间的关系)
【Q】:企业里面的数据库设计一般需要满足哪一范式?
【A】:第一范式 —— 列不可再分
Q1:SQL的执行顺序
【1】 一文讲懂SQL语法顺序与执行顺序
书写顺序:SELECT (distinct) -> FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> UNION -> ORDER BY ->LIMIT
执行顺序:FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT(distinct) -> UNION -> ORDER BY ->LIMIT
Q2:数据库的索引类型,使用索引存在的缺点
- 单列索引 / 组合索引 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索- Mysql 索引类型:FULLTEXT,HASH,BTREE,RTREE
- 索引的优点:提高查询速度
- 索引的缺点:降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
Q6:sql 行列转换
法一:case…when
法二:pivot函数
# 行转列 (pivot),列转行 (Unpivot)
SELECT *
FROM EvaluationTable
PIVOT (SUM(Score)
FOR Attribute IN ([Attrib A], [Attrib B], [Attrib C])
) AS PivotTable;
Q7:sql 两个表 产品表和收益表,输出总收益最大的产品id
Q8:MySQL 中NULL和空值的区别
空值(’’)的长度是0,不占空间;而的NULL长度是NULL,是占用空间的。Link
Q9:某属性的值唯一的方法?
设置主键;
unique约束;
unique索引;
设置外键。
Q10:怎样提高数据库查询效率?
1.优化sql语句;减少表之间的关联、简化查询字段
原则:
1.1 尽量根据主键查询;
1.2 尽量使用单表查询,不要使用关联查询;
1.3 查询时可以使用in,但是绝对不要使用not in;
.
① 避免全表扫描:考虑在 WHERE 和 ORDER BY 涉及的列上建立索引,IN 和 NOT IN 也要慎用,尽量用 BETWEEN 取代。
② 优化 COUNT:某些业务不要求完全精确的 COUNT 值,此时可以使用近似值来代替,EXPLAIN 估算的行数就是一个不错的近似值。
③ 避免子查询:在 MySQL5.5 及以下版本避免子查询,因为执行器会先执行外部的 SQL 再执行内部的 SQL,可以用关联查询代替。
④ 禁止排序:当查询使用 GROUP BY 时,结果集默认会按照分组字段排序,如果不关心顺序,可以使用 ORDER BY NULL 禁止排序。
⑤ 优化分页:从上一次取数据的位置开始扫描,避免使用 OFFSET。
⑥ 优化 UNION:MySQL 通过创建并填充临时表的方式来执行 UNION 查询,除非确实需要消除重复的行,否则使用 UNION ALL,如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,对整个临时表的数据做唯一性检查,代价非常高。
⑦ 使用用户自定义变量:用户自定义变量是一个用来存储内容的临时容器,在连接 MySQL 的整个过程中都存在,可以在任何可以使用表达式的地方使用自定义变量,避免重复查询刚刚更新过的数据。
.
2.创建索引;CREATE INDEX 索引名字 ON 表名称 (列名称);[列名称:规定你需要索引的列。
.
3.添加缓存;
例如:mybatis的一、二级缓存;该操作效率低;
redis缓存 / memercache缓存(String);有效的缓解数据库的压力;
.
4.使用数据库的读写分离;
.
5.定期将数据进行转储;
.
6.进行分库分表操作(最后的操作);数据库服务器数量和运维都需要花费很多时间和精力;
.
这个优化法则归纳为5个层次:
1、 减少数据访问(减少磁盘访问)
2、 返回更少数据(减少网络传输或磁盘访问)
3、 减少交互次数(减少网络传输)
4、 减少服务器CPU开销(减少CPU及内存开销)
5、 利用更多资源(增加资源)
【1】 主要通过三种途径:1.SQL的性能优化,2.数据库的性能优化,3.查询优化
Q11:SQL题(讲思路即可):数据表重构,举了银行每个月的贷款表的例子,然后重构成13列,银行名称加上1-12个月贷款值的列,类似1179. 重新格式化部门表(用case when巴拉巴拉)
Q12:从数据库中随机选择100条记录?
select * from (select * from example order by dbms_random.random) where rownum <= 100 # Oracle - dbms_random包
Select * From TABLE Order By Rand() Limit 100
Select top 100 * from table order by newid() # 提高效率
Q13:行转列,列转行怎么转?
使用decode函数, 或者使用case when语句
pivot
大数据
spark任务提交流程
hive数据倾斜怎么解决
综合 / 笔试
【1】 平安银行校招 - 笔试真题及答案解析
【2】 还是银行面试舒服些…文章来源:https://www.toymoban.com/news/detail-674746.html
其他
【1】NL2SQL:将人类的自然语言问句转化为结构化查询语句文章来源地址https://www.toymoban.com/news/detail-674746.html
到了这里,关于SQL 数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!