MySQL学习日志(二)

# DML 事务 隔离级别 存储引擎对比

##DML    

insert into

第一种:

insert into tb_name [(col1,col2,....)]{values|value}(val1,val2,...)[,(val21,val22,....),....]

第二种:

insert into tb_name set col_name=val1,col2=val2,....

第三种(将一个表中的数据插入到另外一张表中):

insert into tb_name select clause

<!--replace的工作机制: 与Insert相同,除了在新插入的数据与表中的主键或唯一索引定义的数据相同会替换老的行;-->

update 更新数据

UPDATE [LOW_PRIORITY] [IGNORE] table_reference

SET col_name1=val1 [, col_name2={val2] ...

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

update通常情况下,必须要使用where字句,或者使用limit限制要修改的行数

--safe-updates:启动时应该带选项

delete:删除数据

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

truncate tb_name ; 重置表的内容

##MYSQL基本架构

![](media/14612449206116/14612465920660.jpg)

连接池 与用户请求建立连接

连接连接池用到的协议:文本或者二进制

二进制的协议高效一些

核心功能层 查询解析,分析,优化,内置函数

跨存储引擎的功能

query cache 缓存,只保存select查询

存储引擎层 数据的存入和提取

**explain:分析语句,索引的使用**

##MySQL

执行操作时施加的锁的模式

1.读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁

2.写锁:独占锁,排它锁。其他用户不能读,不能写

锁粒度: (数据量)

表锁:table lock

锁定了整张表

行锁:row lock

锁定了需要的行

粒度越小,开销越大,但并发性越好:

粒度越大,开销越小,但并非性越差;

锁的实现位置:

MySQL锁:可以手动使用,可以使用显示锁

存储引擎锁:自动进行的(隐式锁)

显示锁:

lock tables:施加锁

LOCK TABLES

tbl_name lock_type

[, tbl_name lock_type] ...

锁的类型 lock_type

(READ | WRITE)

unlock tables:解锁

InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)

select .... lock in share mode

select .... for update

<!--做备份时要手动施加读锁-->

##事务:Transaction

事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元

ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务

A:Atomicity,原子性,都执行或者都不执行

C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态

I:Isolaction,隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的

D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效

安全性越高,并发性越低

隔离级别:

READ UNCOMMITTEND(读未提交),脏读,不可重复读,幻读

READ COMMITTEND(读提交)  不可重读

REPEATABLE READ (可重读)

SERIALIZABLE(可串行化)强制事务的串行执行避免了幻读;性能极低

启动事务

start transaction

事务提交

commit

事务回顾

rollback

savepoint 控制回滚的位置

SAVEPOINT identifier

ROLLBACK [WORK] TO [SAVEPOINT] identifier

**如何没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交

  1.select @@global.autocommit

  set global autocommit = 0

  2.cimmication:注意 关闭自动提交,请记得手动启动事务,应记得手动提交**

查看mysql的事务隔离级别

show global  variables like ‘tx_isolation‘

select @@global.tx_isolation

设置mysql的事务隔离级别

set global tx_isolation= 级别  (READ UNCOMMITTEND| READ COMMITTEND| REPEATABLE READ | SERIALIZABLE

**建议:对事物要求不特别严格的场景下,可以使用读提交**

MVCC:多版本并发控制

每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照

为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间,(其实里面存储的是系统版本号 system version number)

旨在两个隔离级别下有效:read committed和repeatable read

##MySQL 的存储引擎

定义:存储引擎也通常被称作“表类型”

查看存储引擎

mysql> show engines;

mysql> show table status  [{FROM | IN} db_name] [LIKE ‘pattern‘ | WHERE expr]

比如 :   mysql> show table status in hellodb;

mysql> show table status in hellodb where Name=‘class‘\G

***************************************

Name 表名

Engine 存储引擎

Version:版本

Row_format:行格式

{DEFAULT|DYNAMIC|FIXED|COMMPRESSED|REDUNDANT|COMPACT}

Rows:表中的行数

Avg_row_length:平均每行包含的字节数

Data_length:表中数据总体大小,单位为字节

Max_data_length:表能够占用的最大空间,单位为字节,0表示么有上限

Index_length:索引的大小,单位为字节

Data_free:对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间

Auto_increment:下一个AUTO_INCREMENT的值

Create_time:表的创建时间

Update_time: 表数据的最后一次修改时间

Check_time: 使用CHECK TABLE或myisamchk最近一次检查表的时间

Collation:排序规则

Checksum:如果启动,则为表的checksum

Create_options:创建表时指定使用的其他选项

Comment:表的注释信息

MySQL数据文件

InnoDB

1.innodb_file_per_table=OFF,即是用共享表空间

每个表一个独有的格式定义文件:tb_name.frm

还有一个默认位于数据目录下的共享的表空间文件:ibdata#

2.innodb_file_per_table=ON,即是用独立表空间

每个表在数据库目录下存储两个文件

tb_name.frm

tb_name.ibd

<!--表空间: table space ,由InnoDB管理的特有格式数据文件,内部可同时存储数据和索引-->

MyISAM

每个表都在数据库目录下存储三个文件

tb_name.frm

tb_name.MYD

tb_name.MYI

**修改默认存储引擎:通过default_storage_engine服务变量实现**

##各存储引擎的特性

InnoDB:

支持事务,有事务日志

ib_logfile0

ib_logfile1

支持外键约束

支持MVCC(多版本并发控制)

支持聚簇索引

聚簇索引之外的其他索引,通常称之为辅助索引

行级锁:间隙锁

支持使用辅助索引

支持自使用hash索引

支持热备份

MyISAM:

全文索引

支持表压缩存放:做数据仓库,能节约存储空间并提升性能

支持空间索引

表级锁

延迟更新索引

不支持事务、外键和行级锁

崩溃后无法安全恢复数据

使用场景:只读数据,表较小,能够忍受崩溃后的修复操作和数据丢失

ARCHIVE

仅支持INSERT和SELECT,支持很好压缩功能

应用于存储日志信息,或其他按照时间序列实现的数据采集类的应用

CSV:

将数据存储为CSV格式,不支持索引,仅使用与数据交换场景

BLACKHOLE:

没有存储机制,任何发往次引擎的数据都会丢弃,其会记录二进制日志,因此,常用于多级复制架构中作中转服务器

MEMORY:

保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等,也用于实现临时表

支持hash索引,使用表级锁,不支持BLOB和TEXT数据类型

MRG_MYISAM:

是MYISAM的一个变种,能够将多个MyISAM表合并成一个虚表

NDB:

是MySQL CLUSTER中专用的存储引擎、

第三方的存储引擎

XtraDB:增强的InnoDB,有Percona提供

编译安装时,下载XtraDB的源码替代MySQL存储引擎中的InnoDB的源码

PBXT:MariaDB自带此存储引擎

支持引擎级别的复制、外键约束,对SSD磁盘提供适当支持

支持事务、MVCC

TokuDB:

使用 Fractal Trees索引,适用存储大数据,拥有很好的压缩比,已经被引入MariaDB

##列式数据存储引擎:

Infobright:目前较有名的列式引擎,适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计

InfiniDB

MonetDB

LucidDB

##开源社区存储引擎:

Aria:前身为Maria,是增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存)

Groona:全文索引引擎

Mroonga:是基于Groona的二次开发版

OQGraph:由open query研发,支持图(网状 )结构的存储引擎

SphinxSE:为Sphinx全文搜索服务器提供了SQL接口

Spider:能将数据切分成不同的分片,比较高效透明的实现了分片(shared),并支持在分片上支持并行查询

***如何选择存储引擎

      是否需要事务

      备份的类型的支持

      崩溃后的恢复

      特有的特性***

##索引类型:

聚簇索引

辅助索引

B树索引

R树索引

hash索引

全文索引

时间: 2024-10-05 23:36:12

MySQL学习日志(二)的相关文章

mysql学习日志

Mysql学习日志; 安装:Linux :yum install mysql* -y 验证Mysql是否正常安装:mysqladmin --version 进入 Mysql,要先启动#service mysqld start#mysql 更换Mysql初始密码: 安装完成mysql为空密码,修改密码方式:mysqladmin -u root password newpassword 用户已经有旧密码的更改方式:MYSQLADMIN -u root -p'oldpassword' PASSWORD

MySQL学习(二)复制

复制解决的问题是保持多个服务器之间的数据的一致性,就如同通过复制保持两个文件的一致性一样,只不过MySQL的复制要相对要复杂一些,其基本过程如下: 1)在主库上将数据更改记录到二进制日志(Binary Log)中(这些记录被成为二进制日志事件,即binlog) 2)本分将主库上的日志复制到自己的中继日志(Relay Log)中 3)备库读取中继日志中的事件,将其重放到备库数据之上. 从上面可以看出,复制需要四个进程或线程做事情:主库保存日志.主库根据备库的请求转储日志并发送给备库,备库接受日志保

mysql学习之二:mysql基本用法

安装完mysql后我们可以进行sql语句的操作: 我们可以使用以下命令连接到MySQL服务: mysql -h localhost -u root -p -h参数指定要连接的MySQL服务器地址 -u参数指定连接所使用的用户 -p参数指定使用密码验证登陆 MySQL服务绝大多数功能使用SQL语言进行管理. SQL语言一般约定俗成使用大写,但是语言本身不限制大小写.几乎所有SQL语句都必须以";"结尾. 列出所有数据库: SHOW DATABASES; 创建一个数据库(linuxcast

基于CentOS的Mysql学习补充二--使用Shell创建数据库

文章出处:基于CentOS的Mysql学习补充二--使用Shell创建数据库 关于使用基于命令使用mysql数据库的方法可见文章<基于CentOS的Mysql的使用说明>,本文只要介绍如何使用Shell脚本来创建我们想要的数据库,下面给出我创建数据库的Shell脚本,基本也就是将mysql的一些命令放在shell脚本里面而已. #!/bin/bash #Author: chisj #Time: 2015.7.22 #Describe: Create Database #The username

MySQL学习笔记(二)

-- 回顾 数据库基础知识: 关系型数据库(磁盘),建立在关系模型上的数据库,数据结构(二维表),浪费空间. 操作数据的指令集合:SQL(DDL,DML[DQL]和DCL) 完整性约束:表内和表之间(实体) mysql 关系型数据库:c/s结构软件(连接认证,发送SQL指令,服务器处理指令返回结果,客户端接收结果解析结果) mysql服务端对象:DBMS->Datebase->Table->fields sql 基本操作:库操作,表操作(字段)和数据操作 字符集问题:中文数据问题 改变服

MySQL学习笔记(二)

-- 回顾 数据库基础知识: 1.关系型数据库(磁盘),建立在关系模型上的数据库,数据结构(二维表),浪费空间. 操作数据的指令集合:SQL(DDL,DML[DQL]和DCL) 完整性约束:表内和表之间(实体) mysql 关系型数据库:c/s结构软件(连接认证,发送SQL指令,服务器处理指令返回结果,客户端接收结果解析结果) mysql服务端对象:DBMS->Datebase->Table->fields sql 基本操作:库操作,表操作(字段)和数据操作 字符集问题:中文数据问题 改

MySQL的日志(二):事务日志(redo log和undo log)

本文目录:1.redo log 1.1 redo log和二进制日志的区别 1.2 redo log的基本概念 1.3 日志块(log block) 1.4 log group和redo log file 1.5 redo log的格式 1.6 日志刷盘的规则 1.7 数据页刷盘的规则及checkpoint 1.8 LSN超详细分析 1.9 InnoDB的恢复行为 1.10 和redo log相关的变量2.undo log 2.1 undo log的基本概念 2.2 undo log的存储方式

mybatis学习日志二

一.动态sql语句 if语句 if+where语句 if+set语句 choose(when,otherwise)语句 trim语句 sql片段 foreach语句 总结 bean部分的User类代码: public class User { private int id; private String name; private int age;//如果在if判断中用null,则把int改成Integer private String sex; private List<Integer> i

MySQL学习日志(三)

#用户管理 查询优化 日志  ##MySQL 用户管理  用户账号: [email protected] 用户账号管理: CREATE USER   创建用户         CREATE USER [email protected]    [        IDENTIFIED BY [PASSWORD] 'password'           ]        主机也可以使用通配符: create user [email protected]'172.16.100.1_ _'  IDENT