目录
- 关系型数据库与非关系型数据库的区别
- 数据库三范式
- MySQL中 drop、delete、truncate的区别
- MySQL中 char和 varchar 的区别
- MySQL中inner join、left join、right join以及full join的区别
- MySQL中 having 和 where 的区别
- count(*)、count(1)、count(列名)的区别
- MySQL中视图和表的区别
- 数据完整性约束
- SQL 的执行顺序
- SQL 的优化方法
- 大数据量里的分页查询怎么优化
- 写了一个sql ,如何查看有没有命中索引
- MySQL 的存储引擎和区别
- 索引是什么
- 索引为什么可以加快查询速度
- MySQL中索引的分类
- B树和B+树的区别
- MySQL的索引结构
- 为什么不用二叉树、红黑树、哈希表、B树
- 聚集索引和非聚集索引的区别
- Innodb 和 MyISAM 的索引的区别
- 主键索引和辅助索引具体是什么
- 覆盖索引是什么
- 回表查询是什么
- 简述事务
- MySQL是如何保证ACID的
- MVCC 讲一下
- 数据库事务并发会引发哪些问题
- 事务的四个隔离级别
- Mysql中常见的几种日志
关系型数据库与非关系型数据库的区别
(1)关系型数据库是按照二维表的结构来存储数据,常用的有 mysql、oracle;非关系型数据库一般基于键值对(例如Redis)、基于文档(例如Mongodb)等形式来存储数据。
(2)非关系型数据库一般只能保证数据的最终一致性(更新后的数据不一定立马能访问,但是最后是能访问到的),而关系型数据库保证数据的强一致性,
也就是更新后的数据立马能被访问到。
(3)关系型数据库横向扩展比较难(难以跨多台服务器进行横向扩展),而一些非关系型数据库则原生就支持数据的水平扩展。(在多台服务器之间水平扩展)
数据库三范式
MySQL中 drop、delete、truncate的区别
三者都表示删除。
(1)drop、truncate 是 DDL ,数据定义语言,delete 是 DML,数据操纵语言;
(2)delete 用来删除表的一部分数据或者全部数据,drop 是用来删除表以及表中的全部数据,truncate 是用来删除表中的全部数据;
(3)delete 删除的数据可以回滚,drop、truncate删除的数据不可以回滚;
(4)执行速度:drop > truncate > delete。
MySQL中 char和 varchar 的区别
MySQL中inner join、left join、right join以及full join的区别
MySQL中 having 和 where 的区别
(1)where 后面不能使用聚合函数,而 having 后面可以使用聚合函数;
(2)where 用在 groupby 的前面,而 having 用在 groupby 的后面。
(3)where 对数据行进行过滤, having 是对 分组进行过滤。
count(*)、count(1)、count(列名)的区别
详情
MySQL中视图和表的区别
视图是一种虚拟的表,不存储数据,它是一个数据库查询结果的可视化表示。
(1)视图是外模式(也称为用户模式或者子模式,是用户或者应用程序所见到的数据库的逻辑结构),表是内模式(也称为存储模式或物理模式,是数据库的物理结构的描述);
(2)视图的建立和删除只影响视图本身,不影响对应的基本表;
(3)视图只是一个或多个表依照某个条件组合而成的结果集,没有实际的物理记
录。
数据完整性约束
SQL 的执行顺序
书写顺序:
SELECT -> DISTINCT -> FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
执行顺序:
FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
SQL 的优化方法
(1)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉
及的列上建立索引;
(2)应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用
索引而进行全表扫描;
当使用OR连接条件时,数据库引擎需要在索引中同时查找满足其中任意一个条件的记录。然而,索引通常是按照特定列的顺序进行组织的,而不是按照多个列的组合顺序。因此,对于包含OR条件的查询,如果每个条件涉及的列没有单独的索引,数据库引擎就无法利用索引快速定位到满足条件的记录,而只能进行全表扫描来逐行检查每条记录是否满足其中任意一个条件。
另外,即使每个条件涉及的列都有索引,OR连接条件也可能导致索引失效。这是因为在OR条件中,如果其中一个条件的选择性很低,即满足该条件的记录数量很大,而另一个条件的选择性较高,即满足该条件的记录数量较少,数据库引擎可能会选择放弃使用索引,而进行全表扫描,以避免在索引中进行大量的随机访问,从而导致性能下降。
(3)对慢查询进行优化:看是否查询了不需要的列,查询条件是否没有命中索引
大数据量里的分页查询怎么优化
使用LIMIT和OFFSET进行分页:
优化:
写了一个sql ,如何查看有没有命中索引
使用 EXPLAIN 关键字加上你的查询语句,例如
EXPLAIN SELECT * FROM your_table WHERE your_condition;
执行以上语句后,MySQL会返回一组关于查询执行计划的信息。其中最重要的是 “key” 列和 “Extra” 列。
- “key” 列:表示查询使用的索引。如果在 “key” 列中显示了索引名,则表示查询命中了相应的索引。
- “Extra” 列:提供了关于查询执行的额外信息。如果 “Using index” 出现在 “Extra” 列中,则表示查询只使用了索引,而不需要访问实际的数据行。
MySQL 的存储引擎和区别
Innodb 和 MyISAM 的区别:
- 存储文件:MyISAM (索引数据分离存储)每个表有两个文件,其中MYD是数据文件,MYI是索引文件,Innodb (索引数据一起存储)每个表只有一个idb文件;
- Innodb支持外键,MyISAM 不支持外键;
- Innodb支持事务,MyISAM 不支持事务;
- Innodb支持行级锁,MyISAM 支持表级锁;
- Innodb支持MVCC,MyISAM 不支持MVCC。
- Innodb的性能比 MyISAM 更强大。
索引是什么
索引是一种帮助mysql提高查询效率的数据结构,通常是基于一个或多个列创建的,就像是书的目录一样。索引提供了一种快速查找数据的方式,而不必扫描整张表。
其优点:
- 加快查询速度;
- 帮助排序以避免使用临时表;
- 将随机的IO转换为顺序的IO。
索引这么多优点,为什么不对表中的每一个列创建一个索引?
- 创建索引和维护索引要耗费时间
- 索引需要占用磁盘空间来进行存储
- 在对表进行插入、更新和删除操作时会影响性能
索引为什么可以加快查询速度
数据库索引可以加速查询操作的原因主要有以下两点:
- 减少磁盘I/O操作:当查询没有使用索引时,数据库需要扫描整个数据表来获取查询结果,这会导致大量的磁盘I/O操作。而使用索引可以减少磁盘I/O操作的次数,因为数据库可以直接在索引树上进行搜索,而不必扫描整个数据表。
- 减少数据比较次数:在没有索引的情况下,数据库需要逐行比较整个数据行,以找到符合查询条件的行。而在使用索引的情况下,数据库可以只比较索引树上的节点,而不必比较整个数据行,从而减少了数据比较的次数。
MySQL中索引的分类
最左匹配原则就是指在联合索引中,如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL语句就可以利用这个联合索引去进行匹配。如果一个复合索引包含列A、B、C,那么只有当查询中包含了列A的条件时,数据库才可以利用这个组合索引来加速查询。
B树和B+树的区别
MySQL的索引结构
为什么不用二叉树、红黑树、哈希表、B树
红黑树是一种特殊的平衡二叉树。
为什么不用B树,见上题。
聚集索引和非聚集索引的区别
Innodb 和 MyISAM 的索引的区别
主键索引和辅助索引具体是什么
覆盖索引是什么
回表查询是什么
简述事务
一个事务是由一条或者多条 sql 语句组成的不可分割的单元,要么全部执行成功,要么全部执行失败。
事务有四个基本特性(ACID),分别是原子性,一致性,隔离性,持久性
- 原子性是说事务是一个不可分割的工作单位,事务中的所有操作要么全部执行,要么全部不执行,不会出现部分执行的情况。
- 一致性是说事务的执行必须使数据库从一个一致性状态转换到另一个一致性状态。这意味着事务的执行不会破坏数据的完整性约束。
- 隔离性是指事务的执行不会被其他事务干扰。在并发环境中,每个事务都感觉不到其他事务同时进行的情况,从而保证了事务的独立性。
- 持久性是指一旦事务提交,其对数据库的更改就是永久性的。即使系统发生故障,已提交的更改也不会丢失。
MySQL是如何保证ACID的
MVCC 讲一下
MVCC 多版本并发控制,就是同一条记录在系统中存在多个版本。其存在目的是在
保证数据一致性的前提下提供一种高并发的访问性能。对数据读写在不加读写锁的
情况下实现互不干扰,从而实现数据库的隔离性,在事务隔离级别为读提交和可重
复读中使用到。
数据库事务并发会引发哪些问题
事务的四个隔离级别
InnoDB 的默认事务隔离级别是可重复读。