首页 > 数据库 >MySQL 三个经典的问题

MySQL 三个经典的问题

时间:2023-02-04 11:36:25浏览次数:55  
标签:24 JOIN TableA MySQL TableB 三个 InnoDB MyISAM 经典


前言

今天给大家上3个经典的MySQL问题,希望能对大家有帮助!但是因为笔者计算机水平有限,可能会存在一些错误,烦请指出、斧正!谢谢!

  • 在MySQL中INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别
  • 你会推荐使用 datetime 还是 timestamp 字段?为什么
  • MyISAM 与 InnoDB,什么场景选择哪一个

问题一

在MySQL中INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别?
我们有两张表:

TableA:
id firstName lastName
.......................................
1 arun prasanth
2 ann antony
3 sruthy abc
6 new abc
TableB:
id2 age Place
................
1 24 kerala
2 24 usa
3 25 ekm
5 24 chennai

INNER JOIN(内连接)
这是最简单,最常见,也是最容易理解的Join,两张表使用内连接查询时,得到的结果是两张表中完全匹配的行集。
对于上述两张表,我们有:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
INNER JOIN TableB
ON TableA.id = TableB.id2;

得到的结果即为:

firstName       lastName       age  Place
..............................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm

得到的结果有4个字段,firstName 、 lastName 、 age 、 Place,就是我们上面SQL语句SELECT的4个字段,FROM和INNER JOIN后面的两个表名就是要内连接的两张表,ON后面就是在其中寻找共同点的字段。

LEFT JOIN(左连接)
左连接查询会返回左表中所有行,无论这些行是不是有任何一行在右表中匹配。

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
LEFT JOIN TableB
ON TableA.id = TableB.id2;

查询结果是:

firstName                lastName                 age   Place
.............................................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm
new abc NULL NULL

我们可以看到,TableA中所有行都过来了,即使firstName为new,lastName为abc的那一行id为6,在TableB中找不到id为6的行,仍然在结果集中存在。值得注意的是,因为其id为6,在TableB中找不到对应的id,因此其没有age和Place字段的内容。
RIGHT JOIN(右连接)
右连接查询会返回右表中所有行,无论这些行是不是有任何一行在左表中匹配。

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
RIGHT JOIN TableB
ON TableA.id = TableB.id2;

结果集:

firstName                lastName               age     Place
...............................................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm
NULL NULL 24 chennai

FULL JOIN(全连接)
SQL语句如下:

SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
FULL JOIN TableB
ON TableA.id = TableB.id2;

结果集为:

firstName             lastName              age    Place
...........................................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm
new abc NULL NULL
NULL NULL 24 chennai

查询结果是左连接和右连接的并集。

问题二

你会推荐使用 datetime 还是 timestamp 字段?为什么?

  • 正如Mysql文档描述的那样——datetime的范围是“1000-01-01 00:00:00”到“9999-12-31
    23:59:59”,而timestamp的范围是 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09
    03:14:07’ UTC。如果不想程序在2038年出问题,从这个方面作者建议还是使用datetime。
  • 有一种观点是既不使用 DATETIME 也不使用 TIMESTAMP 字段。如果想将特定的一天作为一个整体来表示(例如生日),可以使用
    DATE 类型,但是如果需要更具体的时间,不要使用 DATETIME 或 TIMESTAMP,而是使用
    BIGINT,并简单地存储自纪元以来的毫秒数(如果使用的是 Java,则为 System.currentTimeMillis())。

这样有几个优点。其一,可以在迁移数据库时避免因为数据类型差异,比如MySQL的DATETIME类型和Oracle的DATETIME类型之间可能存在差异,timestamp类型的精度可能也存在差异,MySQL的timestamp精度不是一开始就支持毫秒精度的。其二,没有时区问题,无论是哪个时区,因为开始计算的时间不同,无论当前时间如何,跨度是一致的。其三,没有timestamp和datatime的范围问题,哪怕是datatime,8000年以后也不能用了,没准我的数据库8000年能用8000年呢。

  • 需要注意的是,bigint是占用8个字节,而timestamp只占用4个字节。从MySQL
    5.6.4开始,Datetime的存储空间变成了5个字节了(准确的说应该是5字节+0~3个字节的FSP分秒精度)。

问题三

MyISAM 与 InnoDB,什么场景选择哪一个?
MyISAM 和 InnoDB 之间的主要区别在于参照完整性和事务。还有其他区别,例如锁定、回滚和全文搜索。

参照完整性

参照完整性确保表之间的关系保持一致。更具体地说,当一个表(例如 Listings)有一个外键(例如 Product ID)指向另一个表(例如 Products)时,当指向的表发生更新或删除时,这些更改会级联到链接的表。在该示例中,如果重命名产品,则链接的表的外键也会更新;如果从Products表中删除产品,则指向已删除条目的 Listings 表中得到任何列表也将被删除。此外,任何 Listings 表中的新列表都必须具有指向有效的现有条目的外键。

InnoDB 是一个关系型 DBMS (RDBMS),因此具有参照完整性,而 MyISAM 则没有。

事务和原子性
使用数据操作语言 (DML) 语句管理表中的数据,例如 SELECT、INSERT、UPDATE 和 DELETE。事务将两个或多个 DML 语句组合成一个工作单元,因此要么应用整个单元,要么不应用。

MyISAM 不支持事务,而 InnoDB 支持。

如果在使用 MyISAM 表时操作被中断,该操作将立即中止,并且受影响的行(甚至每行中的数据)仍然受到影响,即使该操作没有完成。

如果一个操作在使用 InnoDB 表时被中断,因为它使用具有原子性的事务,任何没有完成的事务都不会生效,因为没有提交。

表锁定与行锁定
当查询 MyISAM 表时,正在查询的整个表将被锁定。这意味着后续查询将仅在当前查询完成后才能执行。如果您正在读取一个大表,并且有频繁的读写操作,这可能意味着大量的查询积压。

而当查询 InnoDB 表时,只有涉及的行被锁定,表的其余部分仍然可进行 CRUD 操作。这意味着查询可以在同一个表上同时运行,只要它们不使用同一行。

InnoDB 中的此功能称为并发。尽管并发性很好,但在表的范围查询时有一个缺点,因为在内核线程之间切换存在开销,我们应该对内核线程设置限制以防止服务器停止。

事务和回滚
当在 MyISAM 中执行一个操作时,更改会立刻生效;在 InnoDB 中,这些更改可以回滚。用于控制事务的最常用命令是 COMMIT、ROLLBACK 和 SAVEPOINT。

  • COMMIT - 您可以编写多个 DML 操作,但只有在进行 COMMIT 时才会保存更改
  • ROLLBACK - 您可以丢弃任何尚未提交的操作
  • SAVEPOINT - 实现回滚到指定保存点

可靠性

MyISAM 不提供数据完整性——硬件故障、不正常的关机操作都可能导致数据损坏。这将需要修复或重建索引和表。

而InnoDB 使用事务日志、双写缓冲区和自动校验和和验证来防止数据损坏。在 InnoDB 进行任何更改之前,它会将事务之前的数据记录到一个名为 ibdata1 的系统表空间文件中。如果发生崩溃,InnoDB 将通过这些日志来自动恢复。

全文索引
InnoDB 在 MySQL 5.6.4 版本之前不支持 FULLTEXT 索引。

但是,这不是使用 MyISAM 的理由。最好使用最新版本的 MySQL 。并不是说使用 FULLTEXT 索引的 MyISAM 表不能转换为 InnoDB 表。

总之,InnoDB 应该是我们默认的存储引擎。在有特定需求时可以选择 MyISAM 或其他数据类型。


标签:24,JOIN,TableA,MySQL,TableB,三个,InnoDB,MyISAM,经典
From: https://blog.51cto.com/u_15461374/6036995

相关文章

  • MySQL之主从复制集群搭建
    简述这篇文章主要记录使用​​dockercompose​​​搭建​​MySQL​​主从复制集群搭建,方便后续进行本地测试开发。这篇文章主要介绍一主一从的搭建过程。主从架构,可以缓解M......
  • Mysql 中的日期时间函数汇总
    日期和时间函数MySQL中内置了大量的日期和时间函数,能够灵活、方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数。1CURDATE()函数CURDATE()函数用......
  • linux中mysql安装
    #首先通过yum下载wget命令1.yum-yinstallwget#通过wget下载MySQL存储库2.wgethttps://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm3.rpm-Uvhmy......
  • mysql-数据备份
    1、准备一个mysql数据库1、查看mysql数据库可以看到此时mysql中没有测试数据库bkdatabase。]#/usr/local/mysql-5.7.28-el7-x86_64/bin/mysql-uroot-pmysql>sho......
  • Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig c
    使用SpringDataJPA访问数据时出现该错误,具体报错信息如下:ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug......
  • MySQL创建表的三种方式
    创建表的三种方式通过create语句直接创建语法:create[TEMPORARY]table[IFNOTEXISTS]table_name( col_namecolumn_defination[constrant][NOTNULL|NULL][D......
  • MySQL数据类型补充
    数据类型整数数据类型特殊说明:​ 对于整数类型,MySQL还支持在类型名称后面加小括号(M),而小括号中的M表示显示宽度,M的取值范围是(0,255)。int(M)这个M在字段的属性中指......
  • mysql修改表结构
    3,修改表结构:添加表字段altertable表名add字段名类型约束;例如:altertablestudentaddageintnotnulldefault0aftername;ps:aftername表示在name字......
  • #技术人为什么写博客# MySQL事务--第一篇
    一、概念事务到底是什么东西呢?想必大家学习的时候也是对事务的概念很模糊的。接下来通过一个经典例子讲解事务。银行在两个账户之间转账,从​​A​​​账户转入B账户1000元,系......
  • 【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型
    一、概述你好,我是小雨青年,一名使用MySQL8的程序员。MySQL8引入了对JSON数据类型的全面支持,并提供了一组内置函数以有效处理JSON数据。MySQL8中的JSON支持的一......