前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql基础

Mysql基础

原创
作者头像
大学里的混子
修改2019-04-02 10:46:13
1.5K0
修改2019-04-02 10:46:13
举报
文章被收录于专栏:LeetCode

事务隔离级

spring(数据库)事务隔离级别分为四种(级别递减):

1、Serializable (串行化):最严格的级别,事务串行执行,资源消耗最大;

2、REPEATABLE READ(重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。

3、READ COMMITTED (提交读):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。

4、Read Uncommitted(未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。

--------------------

作者:Somhu

来源:CSDN

原文:https://blog.csdn.net/Somhu/article/details/78775198

链接!

二、创建表

代码语言:javascript
复制
CREATE TABLE mytable (
  id INT NOT NULL AUTO_INCREMENT,
  col1 INT NOT NULL DEFAULT 1,
  col2 VARCHAR(45) NULL,
  col3 DATE NULL,
  PRIMARY KEY (`id`));

三、修改表

添加列

代码语言:javascript
复制
ALTER TABLE mytable
ADD col CHAR(20);Copy to clipboardErrorCopied

删除列

代码语言:javascript
复制
ALTER TABLE mytable
DROP COLUMN col;Copy to clipboardErrorCopied

删除表

代码语言:javascript
复制
DROP TABLE mytable;

六、删除

代码语言:javascript
复制
DELETE FROM mytable
WHERE id = 1;Copy to clipboardErrorCopied

TRUNCATE TABLE 可以清空表,也就是删除所有行。

代码语言:javascript
复制
TRUNCATE TABLE mytable;Copy to clipboardErrorCopied

使用更新和删除操作时一定要用 WHERE 子句,不然会把整张表的数据都破坏。可以先用 SELECT 语句进行测试,防止错误删除。

八、排序

  • ASC :升序(默认)
  • DESC :降序

可以按多个列进行排序,并且为每个列指定不同的排序方式:

代码语言:javascript
复制
SELECT *
FROM mytable
ORDER BY col1 DESC, col2 ASC;

九、过滤

不进行过滤的数据非常大,导致通过网络传输了多余的数据,从而浪费了网络带宽。因此尽量使用 SQL 语句来过滤不必要的数据,而不是传输所有的数据到客户端中然后由客户端进行过滤。

代码语言:javascript
复制
SELECT *
FROM mytable
WHERE col IS NULL;

下表显示了 WHERE 子句可用的操作符

操作符

说明

=

等于

<

小于

>

大于

<> !=

不等于

<= !>

小于等于

>= !<

大于等于

BETWEEN

在两个值之间

IS NULL

为 NULL 值

应该注意到,NULL 与 0、空字符串都不同。

AND 和 OR 用于连接多个过滤条件。优先处理 AND,当一个过滤表达式涉及到多个 AND 和 OR 时,可以使用 () 来决定优先级,使得优先级关系更清晰。

IN 操作符用于匹配一组值,其后也可以接一个 SELECT 子句,从而匹配子查询得到的一组值。

NOT 操作符用于否定一个条件。

十、通配符

通配符也是用在过滤语句中,但它只能用于文本字段。

  • % 匹配 >=0 个任意字符;
  • _ 匹配 ==1 个任意字符;
  • [ ] 可以匹配集合内的字符,例如 [ab] 将匹配字符 a 或者 b。用脱字符 ^ 可以对其进行否定,也就是不匹配集合内的字符。

使用 Like 来进行通配符匹配。

代码语言:javascript
复制
SELECT *
FROM mytable
WHERE col LIKE '[^AB]%'; -- 不以 A 和 B 开头的任意文本 

不要滥用通配符,通配符位于开头处匹配会非常慢。

十三、分组

分组就是把具有相同的数据值的行放在同一组中。

可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。

指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序。

代码语言:javascript
复制
SELECT col, COUNT(*) AS num
FROM mytable
GROUP BY col;

GROUP BY 自动按分组字段进行排序,ORDER BY 也可以按汇总字段来进行排序。

代码语言:javascript
复制
SELECT col, COUNT(*) AS num
FROM mytable
GROUP BY col
ORDER BY num; 

WHERE 过滤行,HAVING 过滤分组,行过滤应当先于分组过滤。

代码语言:javascript
复制
SELECT col, COUNT(*) AS num
FROM mytable
WHERE col > 2
GROUP BY col
HAVING num >= 2; 

分组规定:

  • GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前;
  • 除了汇总字段外,SELECT 语句中的每一字段都必须在 GROUP BY 子句中给出;
  • NULL 的行会单独分为一组;
  • 大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型。

3. 与红黑树的比较

红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B+ Tree 作为索引结构,主要有以下两个原因:

(一)更少的查找次数

平衡树查找操作的时间复杂度和树高 h 相关,O(h)=O(logdN),其中 d 为每个节点的出度。

红黑树的出度为 2,而 B+ Tree 的出度一般都非常大,所以红黑树的树高 h 很明显比 B+ Tree 大非常多,查找的次数也就更多。

(二)利用磁盘预读特性

为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的旋转时间,速度会非常快。

操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。并且可以利用预读特性,相邻的节点也能够被预先载入。

三、存储引擎

InnoDB

是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎。

实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读。

主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。

内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等。

支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。

MyISAM

设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它。

提供了大量的特性,包括压缩表、空间数据索引等。

不支持事务。

不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。

可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。

如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。

比较

  • 事务:InnoDB 是事务型的,可以使用 Commit 和 Rollback 语句。
  • 并发:MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。
  • 外键:InnoDB 支持外键。
  • 备份:InnoDB 支持在线热备份。
  • 崩溃恢复:MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。
  • 其它特性:MyISAM 支持压缩表和空间数据索引。

一、乐观锁

 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。

 version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

核心SQL代码:

update table set x=x+1, version=version+1 where id=#{id} and version=#{version};

 CAS操作方式:即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。

一、悲观锁

总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。

2 触发器的作用(触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。)

SQL触发器是存储在数据库目录中的一组SQL语句。每当与表相关联的事件发生时即会执行或触发SQL触发器,例如插入,更新或删除。

QL触发器是一种特殊类型的存储过程。 这是特别的,因为它不像直接像存储过程那样调用。 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,会自动调用触发器,而存储过程必须要明确地调用。

3 存储过程优缺点(创建一次,多次使用。调用简单,可提供部程序调用。缺点:移植性差)

4 索引作用、优缺点、底层(优点:加速对数据的索引。缺点:降低数据库录入速度,占空间,后期维护等,B+树)

5 事务的特性、并发问题、隔离级别ACID:A原子性、C一致性、I隔离性、D持久性。并发问题:脏读、不可重复读、幻读。 隔离级别:读未提交读已提交可重复读串行化)

6 视图和游标(视图:是一种虚拟的表,具有和物理表相同的功能。游标:是对查询出来的结果集作为一个单元来有效的处理)

7 视图优缺点(优点:选择性的读取数据库、通过简单查询的得到一些原本需要复杂查询才能得到的结果、维护数据的独立性,试图可从多个表检索数据、对于相同的数据可产生不同的视图。缺点:查询视图时,必须把视图的查询转化成对基本表的查询)

https://www.cnblogs.com/chenpi/p/5133648.html

8 数据库查询语句很慢,如何优化(索引、优化sql尽量不做全表查询、减少表关联、优化查询字段等等)

9 数据库三范式(1NF:确保每一列的原子性 2NF:非键字段必须依赖于键字段 3NF:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性

(在2NF基础上消除传递依赖))

11 SQL语言共分为四大类(数据查询语言DQL:select /from/where,数据操纵语言DML:insert/update/delete,数据定义语言DDL:create/drop/truncate/alert,数据控制语言DCL:grant/rollback)

12 drop、delete、truncate区别(不带where的delete和truncate只删除表的数据,不会删除表的结构。速度drop> truncate > delete,delete是dml要等事务生效 、drop和truncate属于ddl理解生效)

13 数据库的乐观锁和悲观锁(乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作)

14 mysql设置隔离级别(语句:set session transaction isolation level read uncommitted 可选参数:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE

  1. 读已提交
  2. 读未提交
  3. 可重复读
  4. 序列化

15 SQL约束(NOT NULL不为空、UNIQUE唯一、PRIMARY KEY主键、FOREIGN KEY外键、CHECK控制字段范围)

16 Mysql数据库引擎MyISAM和InnoDB

MyISAM:

  1. 表锁、
  2. 不支持事务、
  3. 不支持外键、
  4. 全文索引、
  5. 快、内存利用低,

InnoDB:

  • 行锁、
  • 外键
  • 事务)

17 varchar和char(varchar可变长度、char长度固定)

18 数据库锁分类(按锁的粒度分:表锁、行锁、页级锁 。按锁的级别划分:共享锁、排他锁 。按加锁方式分:自动锁、显示锁。按操作划分:DML锁、DDL锁 。按使用方式分:悲观锁、乐观锁)

19 常用数据库默认隔离级别mysql:可重复读 oracle:读已提交 SQLServer:读已提交)

20 Oracle高水位理解(Oracle段(segments)就像水库记录历史水位,一般不会下降,使用truncate命令可以置零)

21 内连接外连接区别(内:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件 外:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接)

22 查询语句有like(尽量避免%XXX%,用不到索引,%在前面不能用到索引,如%ABC不能用索引,而ABC%能用索引 ps:这里感谢大佬@Apiao 大佬指出错误,已更正,万分感谢!)

23 mysql数据库优化(explain写的SQL、只要一行数据用limit 1、使用enum而不是varchar、固定长度的表会更快、分库分表)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 事务隔离级
  • 二、创建表
  • 三、修改表
  • 六、删除
  • 八、排序
  • 九、过滤
  • 十、通配符
  • 十三、分组
    • 3. 与红黑树的比较
    • 三、存储引擎
      • InnoDB
        • MyISAM
          • 比较
          • 一、乐观锁
          • 一、悲观锁
          相关产品与服务
          云数据库 SQL Server
          腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档