点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]
1:数据库的分类
关系型数据库ORDBMS:(oracle、MySQL、SqlServer等)
特点:二维表存储,使用sql语言操作,有事务可以控制数据操作的完整性可以复杂的联查
非关系型数据库nosql:(MongoDB、redis等)
特点:键值对或json存储,弱事务或无事务操作数据效率更高可以用于充当缓存
2:SQL语句分为哪几种?
SQL语句主要可以划分为以下几类:
DDL(Data Definition Language):数据定义语言,定义对数据库对象(库、表、列、索引)的操作。
包括:CREATE、DROP、ALTER、RENAME、 TRUNCATE等
DML(Data Manipulation Language): 数据操作语言,定义对数据库记录的操作。
包括:INSERT、DELETE、UPDATE、SELECT等
DCL(Data Control Language): 数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别。
包括:GRANT、REVOKE等
Transaction Control:事务控制
包括:COMMIT、ROLLBACK、SAVEPOINT等
3:排序
关键字:order by
使用方法:select * from 表名 order by 字段 排序方式
Order by都写在查询语句的最后,如果不加排序方式,默认升序,多个字段排序用逗号分隔
4:分组
关键字:group by
使用方法:select * from 表名 where 条件group by 字段 order by 字段 排序方式
注意:使用group by查询时,查询字段只能是分组字段或聚合函数,当查询的条件为非聚合函数时,可以在group by之前使用where条件判断,如果查询条件为聚合函数,必须在group by之后使用having进行条件判断,having是在分组之后执行的查询条件,having后跟的查询条件必须是聚合函数或者分组字段。
group by多个字段分组,使用逗号分隔,只有分组字段完全相同时,才会正常分租,否则数据全部显示。
5:伪列
Rowid:唯一的物理地址用rowid作为条件查询可以提升查询效率。
Rownum:查询结果的序号可以用于条件查询,不能用于修改和删除
(1)id,Rowid,Rownum的区别?
rowid物理位置的唯一标识。
而id是逻辑上的唯一标识,所以rowid查找速度要快于id,是目前最快的
定位一条记录的方式
rowid和rownum都是"伪数列"
所谓“伪数列”也就是默认隐藏的一个数列。
rownum用于标记结果集中结果顺序的一个字段,
它的特点是按顺序标记,而且是连续的,
换句话说就是只有有rownum=1的记录,才可能有rownum=2的记录。
rownum关键字只能和<或者<=直接关联
如果是>或者=则需要给他0起个别名
6:约束
1.主键约束(Primay Key Coustraint) 唯一性,非空性;
alter table 表名 add constraint 主键名称 primary key (字段名)
注意:主键字段不能重复(唯一的),不可以为空
一般使用id作为一张表的主键,主键在创建时,会生成一个索引。
2.唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个;
Alter table add constraint 约束名 unique (字段名)
3.默认约束 (Default Counstraint) 该数据的默认值;
4.检查约束 (Check Counstraint) 对该列数据的范围、格式的限制(如:年龄、性别等
Alter table 表名 add constraint 约束名 check (字段名 条件)
5.外键约束 (Foreign Key Counstraint) 需要建立两表间的关系;
Alter table 表名 add constraint 约束名 foreign key (主表字段名) references 外键到的表名 (字段名)
6.非空约束(Not Null Counstraint):设置非空约束,该字段不能为空。
alter table 表名 modify 字段名 [not null 非空|null 允许为空]
注意:该字段存储的数据不能为空,但是可以重复。
7:序列(oracle)
oracle中,是通过使用序列(sequence)来处理自动增长列。
(1) 可以为表中的列自动产生值。
(2) 由用户创建数据库对象,并可由多个用户共享。
(3) 一般用于主键或唯一列。
(4) 可以生成唯一标识
创建序列基本语法:
create sequence 序列名称
start with 开始数字
increment by 增长数字
minvalue 最小值
maxvalue 最大值
cycle
nocache
详细说明:
start with 开始数字从几开始
increment by 增长步长,每次增长几个数
minvalue 最小值
maxvalue 最大值可以不设置,不设置应写为nomaxvalue,也就是无穷大
cycle 循环,也就是说当长增长到最大值后,再从最小值开始重新增长
nocache 不设缓存
序列的使用
序列当前值:序列名.currval
根据增量获取序列下一个值:序列名.nextval
8:表联查
根据两张或两张以上表之间的关联关系,进行多张表的同时展示。
内连接(inner join):只会显示两张表中关联字段均不为空的数据
左连接(left join):会显示连接左侧表的所有数据(左侧表为主表)
右连接(right join):会显示连接右侧表的所有数据(右侧表为主表)
全连接(fulljoin):会将两张表所有的数据全部显示
9:Delete、truncate、drop都是删除语句,它们有什么区别?
delete 属于DML语句,删除数据,保留表结构,需要commit,可以回滚,如果数据量大,很慢。
truncate 属于DDL语句,删除所有数据,保留表结构,自动commit,不可以回滚,一次全部删除所有数据,速度相对较快。
Drop属于 DDL语句,删除数据和表结构,不需要commit,删除速度最快。
10: Where和having都是条件筛选关键字,它们有什么分别?
WHERE是在数据分组前进行条件过滤, HAVING子句是在数据分组后进行条件过滤,WHERE子句中不能使用聚合函数,HAVING子句可以使用聚合函数。
11:视图
(1)什么是视图?
视图(View)是一种虚拟存在的表。其内容与真实的表相似,包含一系列带有名称的列和行数据。但是视图并不在数据库中以存储的数据的形式存在。行和列的数据来自定义视图时查询所引用的基本表,并且在具体引用视图时动态生成。
(2)视图的特点
<1> 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系;
<2> 视图是由基本表(实表)产生的表(虚表);
<3> 视图的建立和删除不影响基本表;
<4> 对视图内容的更新(增删改)直接影响基本表;
<5> 当视图来自多个基本表时,不允许添加和删除数据。
(3)视图的优点
<1> 简单:使用视图的用户完全不需要关心视图中的数据是通过什么查询得到的,视图中的数据对用户来说已经是过滤好的符合条件的结果集;
<2> 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行或某个列,但是通过视图就可以简单地实现;
<3> 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,原表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
(4)视图的缺点
①性能差
数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
②修改限制
当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
在定义数据库对象时,不能不加选择地来定义视图,应该权衡视图的优点和缺点,合理地定义视图。
视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。
具有普通表的结构,但是不实现数据存储。
对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,
多表视图一般用于查询,不会改变基本表的数据。
(5)使用语法
创建视图:
create view 视图名 as 查询语句 ;
CREATE VIEW v1 AS SELECT NAME,age FROM t_user;
查看视图:
SELECT * FROM v1;
可以起别名:
CREATE VIEW v2(n,a) AS SELECT NAME,age FROM t_user;
删除语句:
drop view 视图名
12:索引
(1)什么是索引
索引就像是书的目录,是与表或视图关联的磁盘上结构,在数据库中,由于数据存储在数据表中,因此索引是创建在数据库表对象上的,由表中的一个字段或多个字段生成的键组成,这些键存储在数据结构(B-树或哈希表)中,根据索引的存储类型可以将索引分为B-树索引(BTREE)和哈希索引(HASH)。索引可以加快从表或视图中检索行的速度。
索引中包含由表或视图中的一列或多列生成的键。这些键存储在一个结构中,使SQL可以快速有效地查找与键值关联的行。
我们使用索引的一个主要目的就是加快检索表中数据的方法!
(2)为什么要建立索引,即索引的优点
① 建立索引的列可以保证行的唯一性,生成唯一的rowId
② 建立索引可以有效缩短数据的检索时间
③ 建立索引可以加快表与表之间的连接
④ 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
(3)使用索引的缺点
① 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间越大(数据表占据的是数据库的数据空间)
③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长这给数据库的维护速度带来了一定的麻烦。
(4)MySQL数据库中的索引分类
1、普通索引
普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值,它的唯一任务是加快对数据的访问速度,因此,应该只为那些最常出现在查询条件或排序条件中的数据列创建索引。
2、 唯一索引
唯一索引不允许两行有相同的索引值。如果现有数据中存在重复的键值,则一般情况下多数数据库都不允许创建唯一索引。若已创建了唯一索引,再向表中添加重复数据时,数据库也就绝接收此数据。例如:如果在User表中用户的身份证号CarID的列上创建了唯一索引,则所有的用户的身份证号不能重复。创建了唯一索引的列允许有空值。和主键不一样,主键值不允许为空。
3、 主键索引
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是非空、唯一的。当在查询中使用主键索引时,它还允许加快访问数据
4、 复合索引
在创建索引时,并不是只能对其中一列创建索引,与主键一样,可以将多个列组合作为索引,这种索引称为复合索引。
需要注意的是,只有在查询中使用了组合索引最左边字段时,索引才会被使用,即第一个字段作为前缀的集合。
5、 全文索引
全文索引的作用是在定义索引的列上支持值得全文查找,允许在这些索引中插入重复值和空值。全文索引可以在char\varchar\text类型的裂列上创建,主角要用于在大量文本文字中搜索字符创串,此时使用全文索引的效率大大高于使用SQL的like关键字的效率。MySQL 5.5中只有MyISAM存储引擎支持全文索引。
6、 空间索引
空间索引是对空间数据类型的列建立的索引,如geometry、point等。创建空间索引的列,必须将其声明为 not null,空间索引只能在存储引擎为MyISAM的表中创建。
(6)索引的使用
1)创建索引
create[unique | fulltext | spatial] index index_name on table_name (colum_name[length]…);
修改表结构的方式添加索引:
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
创建表的时候同时创建索引:
create table t_user (user_id int(11) NOT NULL PRIMARY KEY (id),user_name char(255) NOT NULL , unique [indexName] (user_name(length))
2)删除索引
drop index index_name on table_name;
注意:删除表时,该表的所有索引将同时被删除。
删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除,如果组成索引的所有列都被删除,则整个索引将被删除。
3)查看索引
在MySQL中,可以使用show index语句查看已创建的索引
show index from table_name;
(7)使用索引的注意事项
1、全值匹配我最爱
2、最佳左前缀法则(带头索引不能死,中间索引不能断)
如果索引了多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且 不跳过索引中的列。
3、不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描
4、mysql存储引擎不能继续使用索引中范围条件(bettween、<、>、in等)右边的列
5、尽量使用覆盖索引(只查询索引的列(索引列和查询列一致)),减少select
6、索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描
7、索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描
8、索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描
由结果可知,like以通配符结束相当于范围查找,索引不会失效。与范围条件(bettween、<、>、in等)不同的是:不会导致右边的索引失效。
9、索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描
10、索引字段使用 or 时,会导致索引失效而转向全表扫描
(8)B-树索引(BTREE)和哈希索引(HASH)的区别
索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。
不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。
Hash索引
所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点:
1、因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询
1、每次都要全表扫描
2、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作
3、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。
4、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。
Btree索引
至于Btree索引,它是以B+树为存储结构实现的。
但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。
13:三范式
1.第一范式,是列的原子性,就是不能再别分割
2.第二范式,是在满足第一范式的前提下,必须有主键,并且非主键的列,必须完全依赖于主键,不能只是依赖主键的一部分。
3.第三范式,是在满足第二范式的前提下,主要说的是外键。就是非主键
列必须直接于主键相关,不能间接相关。
14:存储过程
(1)概述
存储过程和函数是事先经过编译并存储在数据库中的一段sql语句的集合。
(2)存储过程和函数的区别
函数必须有返回值,而存储过程没有。
存储过程的参数可以是IN,OUT,INOUT,类型,而函数只能是IN。
(3)优点
<1> 存储过程只在创建时进行编译,而sql语句每次执行都需要编译,所以存储过程可以提高数据库执行速度。
<2> 简化复杂业务逻辑,结合事务一起封装。
<3> 复用性好,根据需要可重复使用。
<4> 安全性高,可指定存储过程的使用权。
(4)缺点
<1> 可移植性差,相同的存储过程并不能跨多个数据库进行操作。
<2> 大量使用存储过程后,首先会使服务器压力增大,而且维护难度逐渐增加。
(5)使用语法
创建存储过程:
DELIMITER //
CREATE PROCEDURE p1()
BEGIN
SELECT COUNT(*) FROM t_user;
END;//
执行存储过程:
call p1();
15:触发器(trigger)
(1)什么是触发器
本质上是一种与表操作有关的数据库对象。
是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求
(2)触发器的作用
可在写入数据表前,强制检验或转换数据。
触发器发生错误时,异动的结果会被撤销。
部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
可依照特定的情况,替换异动的指令 (INSTEAD OF)。
(3)为什么需要触发器
因为有很多开发的场景 好多逻辑关系他们是原子的
如果某个操作发生 必然会引发另外一个操作
那么这个时候我们手工去写很多sql语句
这个时候就需要触发器代替我们去完成
(4)创建语法
触发器四要素
监视地点(table)监视事件(insert/delete/update)
触发时间(after/before)触发事件(insert/update/delete)
Create trigger triName After/Before insert/update/delete on 表名
For each row (写死的.行触发器 )
Begin
Sql语句 一句或者多句(insert/update/delete) 范围内
End
(5)优点
触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。
例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
其他:限制,执行顺序…
(6)存储过程与触发器的区别
触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。
16:存储引擎
1.InnoDB是事务型数据库的首选引擎,支持ACID事务,支持行锁定和外键,InnoDB是默认的MySQL引擎(5.5版本之后)。
2.MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
3.MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能
17:事务
(1)简介
在数据库中,所谓事务是指一组逻辑操作单元即一组SQL语句,当这个单元中的一部分操作失败时,整个事务回滚,只有全部正确才完成提交。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
(2)事务的四大特性(ACID)
<1> 原子性(Atomicity):最小单位,不可切割;
<2> 一致性(Consistency):事务数据状态都是一致的,要么都成功,要么都失败,一条发生异常,集体回滚;
<3> 隔离性(Isolation):事务和事务之间是互相隔离,互不干扰,一个事务的失败不影响其他事务的运行;
<4> 持久性(Durability):事务一旦提交,不可回退。
(3)事务隔离级别
当多个事务同时进行时,通过设置隔离级别来处理脏读、不可重复读、幻读事件
脏读(Dirty Read):A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。
不可重复读(Unrepeatable Read):事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了。
幻读(Phantom Read):事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行。
第1类丢失更新:事务A撤销时,把已经提交的事务B的更新数据覆盖了。
第2类丢失更新:事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失。
数据并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能就是致命的,数据库通常会通过锁机制来解决数据并发访问问题,按锁定对象不同可以分为表级锁和行级锁;按并发事务锁定关系可以分为共享锁和独占锁,具体的内容大家可以自行查阅资料进行了解。直接使用锁是非常麻烦的,为此数据库为用户提供了自动锁机制,只要用户指定会话的事务隔离级别,数据库就会通过分析SQL语句然后为事务访问的资源加上合适的锁,此外,数据库还会维护这些锁通过各种手段提高系统的性能,这些对用户来说都是透明的(就是说你不用理解,事实上我确实也不知道)。ANSI/ISO SQL 92标准定义了4个等级的事务隔离级别,如下表所示:
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
需要说明的是,事务隔离级别和数据访问的并发性是对立的,事务隔离级别越高并发性就越差。所以要根据具体的应用来确定合适的事务隔离级别,这个地方没有万能的原则。
18:数据库连接池的介绍?为什么要使用数据库连接池?
(1)数据库连接池的介绍
数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
个人理解:在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。
(2)为什么要使用数据库连接池?
在我们不使用数据库连接池的时候,每次访问数据库都需要创建连接,使用完成之后需要释放关闭连接,这样是很耗费资源的。当我们使用数据库连接池的时候,在tomcat启动的时候就创建了指定数量的连接,之后当我们程序使用的时候就直接从连接池里面取,不需要创建,当我们使用完成的时候也不需要关闭连接,而是将连接返回到连接池中,供其他请求继续使用。
(3)数据库连接池技术带来的优势
1、资源复用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2、更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接至于池中备用。此时连接的初始化工作均已完成。
对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间,从而缩减了系统整体响应时间。
3、统一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。发量的压力下稳定性有所下降,此外不提供连接池监控.
(4)常用的数据库连接池有哪些?分别有什么区别?
DBCP:比较稳定 在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控
C3P0:性能比较高 在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,此外不提供连接池监控。
Druid: Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。可以监控数据库访问性能,提供连接池监控
19:性能分析
20:SQL优化
1)select 子句中避免使用 *, 尽量应该根据业务需求按字段进行查询
2)尽量多使用commit 如对大数据量的分段批量提交释放了资源,减轻了服务器压力
3)在写sql语句的话,尽量保持每次查询的sql语句字段用大写,因为解析sql语句时,总是把小写字母转化为大写字母后再执行
4)sql语句中使用 >= 替换 >
5)尽量避免联查,因为联查,查询数据会比单表查询,多更多数据
6)适度的创建索引。例如:数据一般在 5~6 万条的时候创建索引比较合适。
7)用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据而且不会自动排序,所执行效率要快于UNION。
8) 减少访问数据库的次数。如:如果批量删除多条数据,可以用delete from tableName where id
in (1,2,3) 而不要用多执行delete语句进行删除
9)避免使用LIKE操作符(大数据的全文检索使用luncene或者solr)因为使用like不当,会导致性能问题,原因是like在左右两边都有%的时候,不会使用索引。
10)避免在索引列上使用计算和函数,这样索引就不能使用
11)用NOT EXISTS 或(外连接+判断为空)方案 替换 NOT IN操作符
1、 减少数据访问(减少磁盘访问)
2、 返回更少数据(减少网络传输或磁盘访问)
3、 减少交互次数(减少网络传输)
4、 减少服务器CPU开销(减少CPU及内存开销)
5、 利用更多资源(增加资源)
21:常用的SQL语句
(1)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
select * from scott.emp where rowid in (select rd from (select rowid as rd ,rownum as rn from scott.emp ) where rn<=6 and rn>3)
(2)MySQL的分页语句
Select * from table_name?limit?(当前条数,每页条数);
当前条数=(当前页-1)*每页条数
(3)从数据库中随机取50条数据?
select * from (select * from 表名 order by dbms_random.random) where rownum <= 50
select * from table_name order by rand() limit 50;
22:Mybatis中,#{}和${}的区别是什么?
#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 22: …替换。Mybatis在处理#̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
23:当实体类中的属性名和表中的字段名不一样,怎么办?
a) 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
b) 通过来映射字段名和实体类属性名的一一对应的关系
24:其他函数
concat(str1,str2)连接两个字符,等同于||(连接符)的效果
lower()转换为小写upper()转换为大写
rtrim|ltrim(str,search)删除右(左)边出现的字符串,参数str为目标字符串search参数为需要删除的指定字符
substr(str,start,count)str为目标字符串,从start开始,取count个,如果count不给值,则截取到最后一位
replace(string,s1,s2)替换字符串,参数string为目标字符串,s1为目标字符,s2为替换字符
reverse(str)反转str字符串的每个字符
to_date(str,格式)将字符串转换为日期类型
to_char(date,格式)将日期或数值类型的参数转换为指定格式的字符串类型
to_number(str)将字符串转换为数值类型
推荐:《Scratch 3.0少儿人工智能--编程指南》
编辑推荐:1.马上入门。用简单、轻松的语言讲解超实用的知识,孩子一学就能入门,从此打开编程的世界。
2.将学习融入游戏。教孩子制作属于自己的游戏,不仅能培养其想象力和逻辑力,还能让孩子爱上编程。
3.知识扩展,即学即用。书中每章都设有小节,总结所学知识。增添扩展知识点、课前练习和课后思考题等板块,让孩子即学即用,巩固提高。
4.配套视频课程。赠送与书配套的的视频课程,帮助孩子更好地进行Scratch编程学习。
如何购买:点击小程序购买或阅读全文了解更多,也可坚持留言打卡获得!
如何赠送:留言集赞数大于30赞且排名第一的同学赠送一本,集赞截止时间2020.3.6 23:00,定价89RMB。
觉得本文对你有帮助?请分享给更多人
关注「全栈开发者社区」加星标,提升全栈技能
本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!
如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。
好文章,我在看❤️