基础MySQL

目录

MySql

1.连接查询(以小表为基准)[先查小表,根据小表遍历大表]

2.聚合函数

3.SQL 关键字

                1.分页 (Iimit)

                2.倒序 (order by)[ desc 倒序 大到小 ; asc 正序 小到大]

                3.分组  (group by)

                4.去重  (distinct)

4. SQL Select 语句完整的执行顺序:

5. ★数据库三范式

6. 存储引擎

7.★数据库事务

    7.1. ★事务特性: ACID

    7.2. ★事务隔离级别

8.★索引

8.1. ★索引的概念和优点

8.2. 索引的分类

8.3. ★索引的底层实现原理

8.4. ★如何避免索引失效

8.5. ★索引术语

 9.★MySql Explain优化

9.3 ★type 列 ("type"列用于表示访问表时所采用的访问类型。

10.数据库锁

1.行锁和表锁

2.悲观锁和乐观锁


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 

  1. FROM: 指定查询的数据来源,即从哪个表或视图中检索数据。

  2. LEFT JOIN (或其他类型的JOIN): 用于将多个表连接起来,形成更大的数据集。LEFT JOIN 会返回左表中的所有记录,即使右表中没有匹配的记录。

  3. ON: 在JOIN子句中,用于指定连接条件,即哪些列的值需要相等以形成连接。

  4. WHERE: 用于过滤记录,只保留满足指定条件的行。

  5. GROUP BY: 当使用聚合函数如SUM(), AVG()时,用于将数据分组。

  6. HAVING: 类似于WHERE子句,但是作用于聚合操作的结果,用于过滤掉不满足条件的分组。

  7. SELECT: 选择需要返回的列。如果使用了聚合函数或分组,SELECT列表中的非聚合列必须出现在GROUP BY子句中。

  8. AVG()/SUM() (或其他聚合函数): 用于计算每组的平均值、总和等。

  9. ORDER BY: 按照一列或多列的值对结果进行排序。

  10. ASC/DESC: 指定排序的方向,ASC为升序,DESC为降序。

  11. 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 自带的全文索引只能用于数据库引擎为MyISAM 的数据表。

8.3. 索引的底层实现原理

Mysql 目前提供了以下 4 种索引:

B+Tree 索引: 最常见的索引类型, 大部分索引都支持 B+树索引.

Hash 索引: 只有 Memory 引擎支持, 使用场景简单.

R-Tree 索引(空间索引): 空间索引是 MyISAM 引擎的一个特殊索引类型, 主要地理空间数据, 使用也很少.

S-Full-text(全文索引): 全文索引也是 MyISAM的一个特殊索引类型,

B树与B+树的主要区别:(高薪面试题)

  1. 存储数据的位置:  
    B树: 数据既存储在所有节点中(叶子节点和非叶子节点都有数据

    B+树: 所有的数据记录都存储在叶子节点中非叶子节点仅包含索引信息。叶子节点包含了完整的数据和索引键。

  2. 叶子节点之间的链接:

    B树: 叶子节点之间没有链接。

    B+树: 叶子节点之间通过指针相互链接,形成一个链表循环链表,这使得范围查询和遍历变得高效。

8.4. 如何避免索引失效

        1.范围查询

        2.函数运算(如切割函数或+ - 等算数)

        3.字符串不加引号, 造成索引失效.

        4.尽量使用索引覆盖, 避免 select *,这样提高查询效率

explain select age,name,id,tel  from tb where age=22 and  name ='张三'

        5.or关键字连接

                尽量保证or前后的列都有索引,如果其中一个没有索引,则会触发索引失效

        6.使用!=

                不等于 != 也是函数运算的一种,所以会触发索引失效

        7.模糊查询 通配符 例:like '%张'

                查询前并不清楚 ‘张’ 前边会有哪些,所以会全表扫描,会触发索引失效。像'张%' 则不会触发索引失效。

8.5. 索引术语

索引覆盖: 通过索引就能找到你要的资料信息。(用索引覆盖解决回表

回表:通过索引不能完全拿出你要的信息,需要通过数据表再次查询一次才能获取到。(尽量避免回表

索引下推:MySql5.6版后,默认开启,支持简单函数运算。(有效减少回表次数

最左匹配原则:联合索引遵循最左匹配原则,因为索引在创建时,索引的key是从左向右排列的。

聚簇索引:数据和索引储存在一起,查询更快,InnoDB的主键索引叫聚簇索引

非聚簇索引:数据和索引没有存在一起.MyISAM的就是非聚簇索引。

 9.MySql Explain优化

9.1 select_type列 :"select_type"列是用来描述查询的类型

9.2 table列 :"table"列用于表示查询所涉及的表或派生表的名称。

9.3 type 列 ("type"列用于表示访问表时所采用的访问类型。)

下面是常见的"type"值及其含义:

  1. const: 表示通过索引只能匹配到一行数据。 explain select * from student where id = 1688

  2. eq_ref: 表示使用了等值连接(例如,使用主键或唯一索引连接表)。explain SELECT * FROM student s1 JOIN student s2 ON s1.id = s2.id WHERE s1.age = 25;

  3. ref: 表示使用了非唯一索引进行查找,并返回匹配的多行或一行数据。 explain select * from constudent where name = '张68'

  4. eqrange: 表示使用了索引进行范围查找,例如使用比较符(>, <, BETWEEN)或IN操作符。 explain select * from student where age < 1688

  5. index: 表示全索引扫描,也就是说用了某一个索引的全部, 通常发生在查询使用索引覆盖的情况下。explain select count(*) from student ;explain select sum(age) from student

  6. all: 表示全表扫描,即没有使用索引,需要遍历整个表进行查询。 explain select * from student

"type"列的结果是一个逐渐优化的输出,从最优到最差。尽可能选择更快,更有效的访问方法。                                                  

9.4 key列 :在MySQL的EXPLAIN查询结果中,"key"列用于表示用于访问表的索引的名称。它显示了优化器选择的用于访问表的索引的名称,或者标识没有使用索引。

9.5 key_len列 :"key_len"列用于表示索引字段的最大长度。它显示了优化器使用的索引字段的最大长度,以字节为单位。

9.6 ref列 :在MySQL的EXPLAIN查询结果中,"ref"列用于表示连接条件所引用的列或常量。它显示了查询中使用的引用,用于连接表或进行进一步的过滤。

9.7 rows列 :在MySQL的EXPLAIN查询结果中,"rows"列用于表示优化器估计的扫描或访问的行数。它显示了查询执行过程中预计要处理的行数。

9.8 filtered列 :"filtered"列用于表示查询结果经过表过滤后的预计百分比。它显示了查询条件对表数据的过滤效果。"filtered"列的值范围从0到1之间,其中1表示所有行都满足查询条件,0表示没有行满足查询条件。

9.9 Extra列 :"Extra"列提供了关于执行计划中其他附加信息的说明。该列包含了一些额外的操作、提示和优化器的相关信息。


10.数据库锁

1.行锁和表锁

1.1主要是针对锁粒度划分的,一般分为:行锁表锁库锁

行锁:访问数据库的时候,锁定整个行数据, 防止并发错误。

表锁:访问数据库的时候,锁定整个表数据,防止并发错误。

区别:

表锁:开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲 突概率高,并发度最低

行锁:开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

2.悲观锁和乐观锁

(1)悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。

传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

(2)乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号(MVCC)等机制。

乐 观 锁 适 用 于 多 读 的 应 用 类 型 , 这 样 可 以 提 高 吞 吐 量 , 像 数 据 库 如 果 提 供 类 似 于write_condition 机制的其实都是提供的乐观锁。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值