1. Mysql数据库

(1) DELETE与TRUNCATE区别

DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作,不清空AUTO_INCREMENT记录数
TRUNCATE则直接将表删除并重新建表,不会把单独的删除操作记录记入日志保存,删除行是不能恢复的,AUTO_INCREMENT将置为0,效率比DELETE高

(2) 存储过程

1. 概念

存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

2. 创建存储过程怎么写?

“pr_add” 是个简单的 MySQL 存储过程,这个MySQL 存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和。
1)drop procedure if exists pr_add;
2)计算两个数之和
create procedure pr_add ( a int, b int ) begin declare c int;

(3) 索引

1. 概念

索引是对数据库中一或多个列值的排序,帮助数据库高效获取数据的数据结构。假如我们用类比的方法,数据库中的索引就相当于书籍中的目录一样,当我们想找到书中的摸个知识点,我们可以直接去目录中找而不是在书中每页的找,但是这也抛出了索引的一个缺点,在对数据库修改的时候要修改索引到导致时间变多。

2. 分类

普通索引 唯一索引 主键索引 全文索引

3. **优点**

n 加快检索速度
n 唯一索引确保每行数据的唯一性
n 在使用索引的过程可以优化隐藏器,提高系统性能

4. **缺点**

n 插入删除 修改 维护速度下降
n 占用物理和数据空间

(4) 事务

1. 应用场景:存在并发数据访问时才需要事务

2. ACID事务管理四大特性

a) 原子性(Atomicity): 整个事务中的所有操作,要么全部完成,要么全部不完成,
b) 一致性(Correspondence): 在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
c) 隔离性(Isolation): 并发执行的事务彼此无法看到对方的中间状态。
d) 持久性(Durability): 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

3. 事务中的问题与隔离级别

Ø 问题
脏读: 一个事务读取到另一个事务未提交的数据;
不可重复读:一个事务中两次查询的数据不一致 —> 一个事务读到了另一个事务 已经提交数据(update操作)
虚读(幻读):一个事务中两次查询的数据不一致 —> 一个事务读到了另一个事务 已经提交数据(insert操作)
常用数据库默认隔离级别:
MySQL: 可重复读
Oracle: 读已提交
SQLServer: 读已提交

4. 如何进行事务管理

Connection 提供了事务处理的方法,通过调用 setAutoCommit(false)可以设置手动提交事务;

2. Oracle数据库

(1) Oracle是怎样分页的

Oracle中使用rownum来进行分页, 这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10

(2) 说说Oracle中的经常使用到得函数

Length lower 、upper 、to_date 、to_char 、Ltrim 、 rtrim、substr、add_month to_number

(3) mysql,oracle,sql server三者的区别

1. mysql

优点
体积小、速度快、总体拥有成本低,开源;支持多种操作系统;
缺点
不支持热备份;
MySQL最大的缺点是其安全系统,主要是复杂而非标准,

2. oracle

优点
开放性:Oracle 能在所有主流平台上运行(包括 windows)完全支持所有工业标准
可伸缩性,并行性:
安全性:获得最高认证级别的ISO标准认证。
性能:Oracle 性能高 保持开放平台下TPC-D和TPC-C世界记录;
缺点
对硬件的要求很高;
价格比较昂贵;
管理维护麻烦一些;
操作比较复杂,需要技术含量较高;

3. sqlserver

优点
易用性、适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服 器软件紧密关联的集成性、良好的性价比等;
缺点:SQL Server 只能windows上运行,没有丝毫开放性操作系统。
伸缩性并行性 :数据卷伸缩性有限;
安全性:没有获得任何安全证书。

3. Redis数据库(redis的持久化机制,redis的集群搭建详见电商项目知识点4)

(1) 什么是redis?

Redis是一个基于内存的高性能key-value数据库。
应用场景:
1)会话缓存(Session Cache)
(2)全页缓存(FPC)
(3)队列
(4)排行榜/计数器
(5)发布/订阅

(2) 使用redis有哪些好处

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

(3) Reids的特点?

Redis本质上是一个Key-Value类型的内存数据库,定期通过异步操作把数据库数据flush到硬盘上进行保存。每秒可以处理超过 10万次读写操作
设置expire到期时间。
缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,

(5) Redis常见的性能问题解决?

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变

(6) redis相比memcached有哪些优势?

(1) redis作为支持更为丰富的数据类型
(2) redis的速度快
(3) redis可以持久化其数据

4. 数据库语句优化

  1. where子句只能接收from子句输出的数据(分组前使用),而having子句则可以接受来自group by,where或者from子句的输入(分组后使用)。一般放在group by后面使用,作用相当于where,表示对分组统计后的数据再次过滤。
    2. 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
    使用or 来连接条件 使用单侧%可以索引
    4. in 和 not in
    5. 索引并不是越多越好,索引提高了 select 的效率,但也降低了 insert 及 update 的效率后者会重建索引,一个表的索引数最好不要超过6个
    6. 根据查询条件,建立索引,如果查询条件不止一个时,使用组合索引
    7. 在查询条件表达式的左侧尽量不要使用函数,否则索引失效
    8.
    9.建立索引时字段不能有null值

    5. mysql性能优化举例

    LIMIT 1查单条结果的数据,因为用到索引不用全表查询
    数据库引擎查询多MyISM,写操作多用InnoDB,前者修改表导致全表锁,后者可进行行锁
    用 Not Exists 代替not in ,不用in ,not in , is nul, is not null,<>等操作符
    分库分表有垂直切分和水平切分两种
    垂直切分:即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。
    水平切分:当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如 userID 散列,进行划 分,然后存储到多个结构相同的表,和不同的库上。
    mysql 读写分离,所有的写操作都必须对应到Master,添加 Slave减轻压力但要注意同步延迟

1) 当只要一行数据时使用 LIMIT 1
已经知道查询表结果只会有一条结果加上 LIMIT 能使数据库引擎会在找到一条数据后停止搜索,而不是继续往后查找。
2)选择正确的存储引擎
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。
MyISAM 适合于一些需要大量查询的应用,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的,但其对于有大量写操作并不是很好。甚至你只是需要 update 一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。
InnoDB 的趋势会是一个非常复杂的存储引擎,它 支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且他还支持事务。
3)用 Not Exists 代替 Not In
Not Exists 允许用户使用相关子查询已排除一个表中能够与另一个表成功连接的所有记录。Not Exists 用到了连接,能够发挥已经建好的索引的作用。
4)对操作符的优化 尽量不采用不利用索引的操作符
如:in ,not in , is nul, is not null,<>等 某个字段你总要会经常用来做搜索,为其建立索引:
Mysql 中可以使用 alter table 语句来为表中的字段添加索引的基本语法是:
ALTER TABLE <表名> ADD INDEX (<字段>);
5)mysql 分库分表:
分库分表有垂直切分和水平切分两种。
垂直切分:即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库 workDB、商品数据库 payDB、用户数据库 userDB、日志数据库 logDB 等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。
水平切分:当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如 userID 散列,进行划 分,然后存储到多个结构相同的表,和不同的库上。例如,我们的 userDB 中的用户数据表中,每一个表的数据量都很大,就可以把 userDB 切分为结构相同的多个 userDB:part0DB、part1DB 等,再将 userDB 上 的用户数据表 userTable,切分为很多 userTable:userTable0、userTable1 等,然后将这些表按照一定的规 则存储到多个 userDB 上。

mysql 读写分离:
在实际的应用中,读远大于写。Mysql提供了读写分离的机制,所有的写操作都必须对应到Master,一个 Master可以有多个 Slave,甚至 Slave 下还可以挂 Slave。
所有的写操作都是先在 Master 上操作,然后同步更新到 Slave 上,所以从 Master 同步到 Slave 机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave 机器数量的增加也会使这个问题更加严重。
所以,1. 当读压力很大的时候,可以考虑添加 Slave 机器的分式解决,但是当 Slave 机器达到一定的数量就得考虑分库了。 2. 当写压力很大的时候,就必须得进行分库操作。

mybatis 详解(五)———动态SQL

动态sql与静态sql的区别

Sql语句将0 1转化为男女性别

SELECT CASE user_gender WHEN ‘1’ THEN ‘男’ WHEN ‘0’ THEN ‘女’ELSE ‘未知’ END AS gender FROM info_user
IF …ELSE通常在存储过程里面用,普通查询可以用CASE WHEN

MySQL日期比较指定到分:

WHERE DATE_FORMAT(st.create_time,’%Y-%m-%d %H:%i’)>=DATE_FORMAT(‘2017-12-9 10:29:00’,’%Y-%m-%d %H:%i’ )

MySQL 笔记 —— 时间函数、时间比较

https://blog.csdn.net/qq_19865749/article/details/78535414

详解Mysql中日期比较大小的方法

https://www.jb51.net/article/138562.htm

mysql 日期加减操作

mysql 日期加减天数