目录
1.什么是数据库?
关系型数据库
非关系型数据库
2.Mysql出现性能差的原因?
3.MySQL的内联,左外联,右外连接的区别
4.为什么要有三大范式
建表需要考虑的问题?
char和varchar的区别
blob和text的区别?
DATETIME和TIMESTAMP的区别
in和exists的区别
null值陷
5.记录货币用什么类型比较好
6.怎么存储emoji
7.DROP,DELETE,TRUNCATE的区别?
8.UNION和UNIONALL的区别
9.一条sql的执行流程
10.mysql中bin目录下的执行文件
11.隐式数据类型转换
1.什么是数据库?
数据库是按照数据结构来组织、存储和管理数据的仓库,它是计算机系统中用于高效存储和处理数据的核心组件。分为关系型数据库和非关系型数据库.
关系型数据库
采用关系模型(二维表格结构)来组织数据,强调数据的一致性和完整性,支持 SQL(结构化查询语言)进行操作。
- MySQL:开源免费,性能稳定,易于部署和使用,是 Web 应用开发中最常用的数据库之一。
- PostgreSQL:功能强大的开源关系型数据库,支持复杂的数据类型和高级查询,对事务的支持非常完善,适合对数据一致性要求高的企业级应用
- Oracle:商业级关系型数据库,性能卓越,安全性高,支持大规模数据存储和并发处理,广泛应用于大型企业的核心业务系统,如银行的交易系统、电信的客户管理系统等。
- SQL Server:微软推出的关系型数据库,与 Windows 系统和.NET 平台兼容性好,适合在微软技术栈环境下开发的应用,如企业内部的管理系统等。
非关系型数据库
- MongoDB:文档型数据库,数据以类似 JSON 的文档形式存储,结构灵活,适合存储非结构化或半结构化数据,如博客文章、用户评论、产品描述等。
- Redis:内存数据库,读写速度极快,支持多种数据结构(字符串、哈希、列表、集合等),常被用作缓存、会话存储、实时排行榜等场景。例如,电商网站的商品详情页缓存可以用 Redis 来提升访问速度。
- Cassandra:分布式列存储数据库,具有高可用性、高扩展性和容错能力,适合处理海量数据,如社交网络的用户行为数据、物联网设备产生的海量日志数据等。
- Elasticsearch:基于 Lucene 的搜索引擎数据库,擅长全文检索和数据分析,常用于日志分析、商品搜索、企业内部文档检索等场景。
2.Mysql出现性能差的原因?
可能是 SQL 查询使用了全表扫描,也可能是查询语句过于复杂,如多表 JOIN 或嵌套子查询。
也有可能是单表数据量过大。
锁和并发问题
通常情况下,添加索引就能解决大部分性能问题。对于一些热点数据,还可以通过增加 Redis 缓存,来减轻数据库的访问压力。
3.MySQL的内联,左外联,右外连接的区别
连接类型 | 保留哪边的所有行? | 匹配不到时如何处理? | 结果集特点 |
---|---|---|---|
INNER JOIN | 都不保留 | 直接丢弃 | 只保留两边都匹配上的行 |
LEFT JOIN | 保留左表所有行 | 右表补 NULL | 左表全有,右表补空 |
RIGHT JOIN | 保留右表所有行 | 左表补 NULL | 右表全有,左表补空 |
4.为什么要有三大范式
第一范式: 列不可再分(原子性)
第二范式::非主属性必须完全依赖于主键
第三范式:非主属性不能依赖于其他的非主属性
三大范式主要是防止数据冗余
建表需要考虑的问题?
首先需要考虑表是否符合数据库的三大范式,确保字段不可再分,消除非主键依赖,确保字段仅依赖于主键等。
然后在选择字段类型时,应该尽量选择合适的数据类型。
在字符集上,尽量选择 utf8mb4,这样不仅可以支持中文和英文,还可以支持表情符号等。
当数据量较大时,比如上千万行数据,需要考虑分表。比如订单表,可以采用水平分表的方式来分散单表存储压力。
char和varchar的区别
varchar是可变型的字符类型 char是固定长度
blob和text的区别?
blob是二进制的数据 比如图片,视频,音频等,text是用来存储文本数据
DATETIME和TIMESTAMP的区别
DATETIME 直接存储日期和时间的完整值,与时区无关。默认是null
TIMESTAMP 存储的是 Unix 时间戳,1970-01-01 00:00:01 UTC 以来的秒数,受时区影响。默认是当前的时间
in和exists的区别
in是子查询,将子查询的结果集用于外部内容,适用于结果集较小的情况
in会有性能瓶颈,因为会建一个临时表 存储到内存中
exists会对外部每一行执行一次子查询,关注点在于子查询是否返回行 是则为ture,适用于子查询结果集比较大的情况
null值陷
IN
: 如果子查询的结果集中包含 NULL
值,可能会导致意外的结果。例如,WHERE column IN (subquery)
,如果 subquery
返回 NULL
,则 column IN (subquery)
永远不会为真,除非 column
本身也为 NULL
。
EXISTS
: 对 NULL
值的处理更加直接。EXISTS
只是检查子查询是否返回行,不关心行的具体值,因此不受 NULL
值的影响。
5.记录货币用什么类型比较好
DECIMAL
6.怎么存储emoji
一般用UTF-8mb4字符集
7.DROP,DELETE,TRUNCATE的区别?
DROP 是物理删除,用来删除整张表,包括表结构,且不能回滚。
DELETE 支持行级删除,可以带 WHERE 条件,可以回滚。
TRUNCATE 用于清空表中的所有数据,但会保留表结构,不能回滚。
8.UNION和UNIONALL的区别
UNION会去重
9.一条sql的执行流程
SQL 文本↓
[连接器] 认证、维持连接↓
[查询缓存] 8.0 已废弃↓
[解析器] 拆词 → 语法树↓
[预处理器] 语义检查、权限校验↓
[优化器] 选索引、生成执行计划↓
[执行器] 调存储引擎接口↓
[存储引擎] 读磁盘 → 内存 → 返回行↓
客户端收到结果
10.mysql中bin目录下的执行文件
- mysql:用于连接 MySQL 服务器
- mysqldump:用于数据库备份,对数据备份、迁移或恢复时非常有用
- mysqladmin:用来执行一些管理操作,比如说创建数据库、删除数据库、查看 MySQL 服务器的状态等。
- mysqlcheck:用于检查、修复、分析和优化数据库表,对数据库的维护和性能优化非常有用。
- mysqlimport:用于从文本文件中导入数据到数据库表中,适合批量数据导入。
- mysqlshow:用于显示 MySQL 数据库服务器中的数据库、表、列等信息。
- mysqlbinlog:用于查看 MySQL 二进制日志文件的内容,可以用于恢复数据、查看数据变更等
11.隐式数据类型转换
当一个整数和一个浮点数相加时,整数会被转换为浮点数。
SELECT 1 + 1.0; -- 结果为 2.0
当一个字符串和一个整数相加时,字符串会被转换为整数。
SELECT '1' + 1; -- 结果为 2
隐式转换会导致意想不到的结果,最好通过显式转换来规避