数据库+消息队列
2020-04-21 10:39:43 1 举报
AI智能生成
数据库常用语法,及面试常考题
作者其他创作
大纲/内容
数据库架构
B-树、B+树、Hash结构
稀疏索引只为部分搜索码建立索引项
如何设计一个关系型数据库
程序:
存储管理、缓存机制、SQL解析、日志管理、权限管理、容灾机制、索引管理、锁管理
文件系统-存储的硬件
存储管理、缓存机制、SQL解析、日志管理、权限管理、容灾机制、索引管理、锁管理
文件系统-存储的硬件
- **为什么要使用索引?
- **什么样的信息能成为索引?
- **索引的数据结构?
B-树、B+树、Hash结构
- **密集索引和稀疏索引和区别?
稀疏索引只为部分搜索码建立索引项
关系型数据库
存储形式为行、列的表类型,Oracle、DB2、Microsoft SQL Server、MySQL
非关系型数据库
key-value形式:Hbase、Redis、MongoDB
InnoDB
若存在主键,该主键为密集索引
若不存在,该表第一个唯一非空索引则为密集索引
若不满足,该表则会存在一个隐藏的密集索引
若不存在,该表第一个唯一非空索引则为密集索引
若不满足,该表则会存在一个隐藏的密集索引
索引模块衍生问题
优化慢查询SQL:
1、根据慢日志定位慢SQL
2、使用explain分析SQL
3、修改SQL或者尽量走索引
1、根据慢日志定位慢SQL
2、使用explain分析SQL
3、修改SQL或者尽量走索引
查询慢日志:
show variables like '%quer%';
show status like '%slow_queries%'; # 查询慢请求状态
set global slow_query_log = on; # 打开慢查询日志
set global long_query_time = 1; # 设置超时时间
show variables like '%quer%';
show status like '%slow_queries%'; # 查询慢请求状态
set global slow_query_log = on; # 打开慢查询日志
set global long_query_time = 1; # 设置超时时间
explain + 查询SQL;
关键字:type:
如果为index 和all 表示为全表扫描
如果为index 和all 表示为全表扫描
关键字:extra:
如果为using filesort 和 using temporary 表示无法使用索引
如果为using filesort 和 using temporary 表示无法使用索引
加索引:
alter table 表名 add index idx_name(列名);
alter table 表名 add index idx_name(列名);
索引的最左匹配原则成因:
最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
索引是建立的越多越好吗?
数据量小的表不需要建立索引,增加索引会产生额外的开销
数据变更需要维护索引,更多的索引需要占用更多的资源
更多索引需要更多的空间
数据量小的表不需要建立索引,增加索引会产生额外的开销
数据变更需要维护索引,更多的索引需要占用更多的资源
更多索引需要更多的空间
索引分类
唯一索引
主键索引
联合索引
全文索引
常用SQL语句
条件查询
关联查询
分组查询
逻辑关键字
函数
SQL优化
表结构索引优化
查看慢日志
explain查看执行计划
优化SQL语句
SQL语句优化
MySQL参数优化
硬件及系统配置
数据库事务
四大特性:ACID
原子性
一致性
隔离性
持久性
原子性
一致性
隔离性
持久性
查询隔离级别:select @@tx_isolation;
更改事务隔离级别:set session transaction
更改事务隔离级别:set session transaction
问题:脏读、不可重复读、幻读
隔离级别:未提交读、已提交读、可重复度、串行化。
1、事务的特性:原子性、一致性、隔离性、持久性
2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读
3、事务隔离级别:未提交读、已提交读、可重复读、串行化
4、不同事务隔离级别的区别:
未提交读:一个事务还未提交,它所做的变更就可以被别的事务看到
已提交读:一个事务提交之后,它所做的变更才可以被别的事务看到---oracle数据库
可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的---MySQL
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
隔离级别:未提交读、已提交读、可重复度、串行化。
1、事务的特性:原子性、一致性、隔离性、持久性
2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读
3、事务隔离级别:未提交读、已提交读、可重复读、串行化
4、不同事务隔离级别的区别:
未提交读:一个事务还未提交,它所做的变更就可以被别的事务看到
已提交读:一个事务提交之后,它所做的变更才可以被别的事务看到---oracle数据库
可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的---MySQL
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
事务隔离级别越高,串行化越严重,这样就降低了事务的并发度,
having group by sum(case when sign_in = 1 then 1 else 0 end)as chuqinNum,
消息队列
使用场景
应用解耦合
服务通信
削峰填谷
消息广播
消息协议
JMS
java平台消息记录
AMQP
客户端应用和消息中间件服务器的高级消息
常用队列
RabbitMQ
kafka
SQL语句优化
- 查询语句无论是使用哪种判断条件 等于、小于、大于, WHERE 左侧的条件查询字段不要使用函数或者表达式
- 使用 EXPLAIN 命令优化你的 SELECT 查询,对于复杂、效率低的 sql 语句,我们通常是使用 explain sql 来分析这条 sql 语句,这样方便我们分析,进行优化。
- 当你的 SELECT 查询语句只需要使用一条记录时,要使用 LIMIT 1
- 不要直接使用 SELECT *,而应该使用具体需要查询的表字段,因为使用 EXPLAIN 进行分析时,SELECT * 使用的是全表扫描,也就是 type = all。
- 为每一张表设置一个 ID 属性
- 避免在 WHERE 字句中对字段进行 NULL 判断
- 避免在 WHERE 中使用 != 或 <> 操作符
- 使用 BETWEEN AND 替代 IN
- 为搜索字段创建索引
- 选择正确的存储引擎,InnoDB 、MyISAM 、MEMORY 等
- 使用 LIKE %abc% 不会走索引,而使用 LIKE abc% 会走索引
- 对于枚举类型的字段(即有固定罗列值的字段),建议使用ENUM而不是VARCHAR,如性别、星期、类型、类别等
- 拆分大的 DELETE 或 INSERT 语句
- 选择合适的字段类型,选择标准是 尽可能小、尽可能定长、尽可能使用整数。
- 字段设计尽可能使用 NOT NULL
0 条评论
下一页