目录
MySql
1.连接查询
2.聚合函数
3.SQL 关键字
1.分页 (Iimit)
2.倒序 (order by)
3.分组 (group by)
4.去重 (distinct)
4. SQL Select 语句完整的执行顺序:
5. ★数据库三范式
6. 存储引擎
7.★数据库事务
7.1. ★事务特性: ACID
7.2. ★事务隔离级别
8.★索引
8.1. ★索引的概念和优点
8.2. 索引的分类
8.3. ★索引的底层实现原理
9.★MySql Explain优化
9.1 select_type列
9.2 table列
9.3 ★type 列
9.4 key列
9.5 key_len列
9.6 ref列
9.7 rows列
9.8 filtered列
9.9 Extra列
MySql
1.连接查询(以小表为基准)[先查小表,根据小表遍历大表]
1.左连接 left join
(左外连接)以左表为基准进行查询,左表数据会全部显示出来,右表 如果和左表匹配 的数据则显示相应字段的数据,如果不匹配,则显示为 NULL;
2.右连接 right join
(右外连接)以右表为基准进行查询,右表数据会全部显示出来,左表 如果和右表匹配 的数据则显示相应字段的数据,如果不匹配,则显示为 NULL;
2.聚合函数
聚合函数:SQL中提供的可以用来统计、计算、求最值等
COUNT: 统计行的数量
SUM: 获取组的和
AVG: 计算组的平均值
MAX: 计算组的最大值
MIN: 计算组的最小值
3.SQL 关键字
1.分页 (Iimit)
SELECT * FROM students LIMIT 100,6;
查询学生表中所有数据,跳过100条,从第101条开始显示,取6条。
2.倒序 (order by)[ desc 倒序 大到小 ; asc 正序 小到大]
SELECT * FROM students ORDER BY age DESC, id DESC;
查询学生表中所有数据,根据 年龄 倒序排序,年龄相等则根据 ID 倒序排序。
3.分组 (group by)
SELECT sex , count(*) FROM students GROUP BY sex;
查询学生表的性别和每组的数量,根据sex进行分组
4.去重 (distinct)
SELECT DISTINCT name FROM students;
查询学生表的姓名并去除重复的然后返回
4. SQL Select 语句完整的执行顺序:
form→ left join→ on→ where→ group by→ having→ select→ avg()/sum()→ order by→ asc/desc→ limit
-
FROM: 指定查询的数据来源,即从哪个表或视图中检索数据。
-
LEFT JOIN (或其他类型的JOIN): 用于将多个表连接起来,形成更大的数据集。LEFT JOIN 会返回左表中的所有记录,即使右表中没有匹配的记录。
-
ON: 在JOIN子句中,用于指定连接条件,即哪些列的值需要相等以形成连接。
-
WHERE: 用于过滤记录,只保留满足指定条件的行。
-
GROUP BY: 当使用聚合函数如SUM(), AVG()时,用于将数据分组。
-
HAVING: 类似于WHERE子句,但是作用于聚合操作的结果,用于过滤掉不满足条件的分组。
-
SELECT: 选择需要返回的列。如果使用了聚合函数或分组,SELECT列表中的非聚合列必须出现在GROUP BY子句中。
-
AVG()/SUM() (或其他聚合函数): 用于计算每组的平均值、总和等。
-
ORDER BY: 按照一列或多列的值对结果进行排序。
-
ASC/DESC: 指定排序的方向,ASC为升序,DESC为降序。
-
LIMIT: 限制返回的行数,常用于分页查询。
5. ★数据库三范式
第一范式:列或字段要有原子性,不可再分解
第二范式:非主键字段必须依赖于主键字段,不存在部份依赖,必须有主键字段(解决行的冗余)
第三范式:非主键字段不能依赖于其他非主键字段,(解决列的冗余)
6. 存储引擎
MyISAM 存储引擎 与 InnoDB 引擎区别?
1. 事务支持:MyISAM 不支持事务处理,而 InnoDB 支持事务处理。
2. 锁定机制(锁的粒度):MyISAM 在最低支持表级锁。而 InnoDB 支持行级锁,不会对整个表进行锁定,可以减少锁定冲突和死锁的发生。
3. 并发性能:在并发性能方面,InnoDB 要优于 MyISAM。由于 InnoDB 支持行级锁定和事务处理,因此在高并发情况下,InnoDB 的并发性能更高。
7.★数据库事务
7.1. ★事务特性: ACID
-
A:原子性。多条SQL要么同时成功,要么同时失败
-
C:一致性。事务执行前后,数据状态是一致的
-
I:隔离性。每个事务都是单独的个体,事务之间各自的执行结果互不影响
-
D:持久性。事务一旦结束,对数据库的改变将是永久性的,无法再次撤回
7.2. ★事务隔离级别
问题 | 描述 | 隔离级别 |
---|---|---|
脏读 | 一个事务读取到另一个事务还未提交的数据 | read-commited(读未提交) |
不可重复读 | 一个事务内多次读取一行数据的内容,其结果不一致 | repeatable-read(读已提交) 针对 update 或 delete |
幻读 | 一个事务内多次读取一张表中的内容,其结果不一致 | serialized-read(可重复读) 针对 insert |
效率慢,无安全问题 | 同一时间只能有一个事务进行 | serializable(可串行化) |
InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
8.★索引
8.1. ★索引的概念和优点
概念:
索引存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查找速度,提高数据库的性能。 空间换时间
优点:加快查询效率
缺点:1.占用内存空间 2.影响增删改,效率低下
8.2. 索引的分类
(1) 普通索引:最基本的索引,它没有任何限制。(值可重复)
(2) 唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。(会员表里面的手机号,身份证号)
(3) 主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用 primary key 来约束。
(4) 联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。(手机号和密码)
(5) 全文索引:老版本 MySQL 自带的全文索引只能用于数据库引擎为
8.3. ★索引的底层实现原理
Mysql 目前提供了以下 4 种索引:
B+Tree 索引: 最常见的索引类型, 大部分索引都支持 B+树索引.
Hash 索引: 只有 Memory 引擎支持, 使用场景简单.
R-Tree 索引(空间索引): 空间索引是 MyISAM 引擎的一个特殊索引类型, 主要地理空间数据, 使用也很少.
S-Full-text(全文索引): 全文索引也是 MyISAM的一个特殊索引类型,
B树与B+树的主要区别:(高薪面试题)
-
存储数据的位置:
B树: 数据既存储在所有节点中(叶子节点和非叶子节点都有数据)
B+树: 所有的数据记录都存储在叶子节点中,非叶子节点仅包含索引信息。叶子节点包含了完整的数据和索引键。 - 叶子节点之间的链接:
B树: 叶子节点之间没有链接。
B+树: 叶子节点之间通过指针相互链接,形成一个链表或循环链表,这使得范围查询和遍历变得高效。
9.★MySql Explain优化
9.1 select_type列 :"select_type"列是用来描述查询的类型
9.2 table列 :"table"列用于表示查询所涉及的表或派生表的名称。
9.3 ★type 列 ("type"列用于表示访问表时所采用的访问类型。)
下面是常见的"type"值及其含义:
-
const: 表示通过索引只能匹配到一行数据。 explain select * from student where id = 1688
-
eq_ref: 表示使用了等值连接(例如,使用主键或唯一索引连接表)。explain SELECT * FROM student s1 JOIN student s2 ON s1.id = s2.id WHERE s1.age = 25;
-
ref: 表示使用了非唯一索引进行查找,并返回匹配的多行或一行数据。 explain select * from constudent where name = '张68'
-
eqrange: 表示使用了索引进行范围查找,例如使用比较符(>, <, BETWEEN)或IN操作符。 explain select * from student where age < 1688
-
index: 表示全索引扫描,也就是说用了某一个索引的全部, 通常发生在查询使用索引覆盖的情况下。explain select count(*) from student ;explain select sum(age) from student
-
all: 表示全表扫描,即没有使用索引,需要遍历整个表进行查询。 explain select * from student
"type"列的结果是一个逐渐优化的输出,从最优到最差。尽可能选择更快,更有效的访问方法。