通过对MySQL数据库主体配置索引,事务与存储引擎的解析,有利于更加熟悉并掌握MySQL。
是一个排序的列表,存储着索引值和这个值所对应的物理地址
无须对整个表进行扫描,通过物理地址就可以找到所需数据
是表中一列或者若干列值排序的方法
需要额外的磁盘空间
数据库利用各种快速定位技术,能够大大加快查询速率
当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度
可以降低数据库的IO(输入输出)成本,并且还可以降低数据库的排序成本
通过创建唯一性索引保证数据表数据的唯一性
可以加快表与表之间的连接
在使用分组和排序时,可大大减少分组和排序时间
普通索引,唯一索引,主键索引,组合索引,全文索引
1,直接创建索引
2,修改表结构方式添加索引
3,创建表结构时创建索引
最基本的索引类型,没有唯一性之类的限制
创建普通索引的方式
1. mysql >CREATE INDEX index_name ON table_name(column); 直接创建
2. mysql>ALTER TABLE table_name ADD INDEX index_name(column) ;修改表时添加
3. CREATE TABLE table ('id 'int(11) NOT NULL AUTO_INCREMENT ,'title 'char (255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,'content' text CHARACTER SET utf8 COLI ATE utf8_general_ci NULL,'time' int(10) NULL DEFAULT NULL,PRIMARY KEY ( 'id '), INDEX index_name (title)) ; 创建表时添加
用法示例:
mysql> create database tree;创建数据库
mysql> use tree; 使用数据库
mysql> create table fruits(id int(10) primary key, name varchar(128) not null, guanli varchar(128) not null,vlaue decimal(10));
mysql> desc fruits; 描述所有字段
1.直接创建索引
mysql> create index putong on fruits(name); 直接创建索引
mysql> show index from fruits; 查看索引
mysql> show index from fruits\G
mysql> drop index putong on fruits; 删除索引
mysql> show index from fruits;查看索引
mysql> alter table fruits add index putong2(guanli);
mysql> show index from fruits; 查看索引
3.创建表时添加索引
mysql> create table apple(id int(10) auto_increment primary key, name varchar(128) not null, vlaue decimal(10), index putong(name));
mysql> show index from apple; 查看索引
与“普通索引”基本相同
与普通索引的区别是索引列的所有值只能出现一次,即必须唯一
创建唯一索引的方式
1.直接创建
mysq1>CREATE UNIQUE INDEX index_name ON table_name (column) ;
2.修改表时添加
mysql>ALTER TABLE table_name ADD UNIQUE index_name (column) ;
3.创建表时添加
CREATE TABLE table (
‘id’ int(11) NOT NULL AUTO_ INCREMENT ,‘title’ char (255) CHARACTER SET utf8 COLLATE utf8_general_ci
NOT NULL,content’ text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
time’int(10) NULL
DEFAULT NULL,PRIMARY KEY ( id ),UNIQUE indexName (title)) ;
用法示例:
mysql> desc apple; 描述apple表
mysql> insert into apple values(1,'tian',16),(2,'cui',16),(3,'tian',20),(4,'big',34); 插入数据记录
mysql> select * from apple; 查询所有字段
1.直接对字段添加唯一索引
mysql> create unique index one on apple(name);
ERROR 1062 (23000): Duplicate entry 'tian' for key 'one'
Duplicate:重复报错
mysql> create unique index one on apple(vlaue);
ERROR 1062 (23000): Duplicate entry '16' for key 'one'
mysql> create unique index one on apple(id);
mysql> show index from apple; 查看索引
mysql> drop index one on apple;删除索引
mysql> show index from apple; 查看索引
mysql> alter table apple add unique two(id);
mysql> show index from apple; 查看索引
mysql> create table colour(id int(10), name varchar(128), numder int(10), unique three(id));
mysql> show index from colour; 查看索引
是一种特殊的唯一索引,指定为“PRIMARY KEY”
一个表只能有一个主键,不允许有空值
一般是在建表的时候同时创建主键索引
创建主键索引的方式
1.修改表时添加
mysql>alter table table_name add primary key(id) ;
2.创建表时添加
CREATE TABLE table_name,
'id' int(11) NOT NULL AUTO INCREMENT
'title' char (255) NOT NULL,PRIMARY KEY
( 'id' ));
用法示例:
1.创建表时添加索引
mysql> desc colour; 描述colour表
mysql> insert into colour(name,numder) values('red',0); 插入数据记录
mysql> select * from colour; 查询所有字段
mysql> drop index three on colour;删除在表colour索引three
mysql> show index from colour; 查看索引
mysql> delete from tree.colour; 删除数据库tree中表colour中的所有数据记录
mysql> desc colour; 描述colour表
mysql> insert into colour values(1,'red',0);插入数据记录
mysql> insert into colour values(2,'green',0);
mysql> alter table colour add primary key (id);修改表时添加主键索引
mysql> show index from colour; 查看索引
可以是单列上创建的索引,也可以是在与多列上创建的索引
最左原则,从左往右依次执行
创建组合索引的方式
用法示例:
创建表时添加索引
mysql> create table user(name varchar(64), age int(3), sex tinyint(1), index user(name,age,sex));
mysql> show index from user; 查看索引
MySQL从3.23.23版开始支持全文索引和全文检索
索引类型为FULLTEXT
可以在CHAR,VARCHAR或者TEXT类型是列上创建
1.直接创建索引
CREATE INDEX index_name ON table_name(column(length));
2.创建表时添加
ALTER TABLE table_name ADD INDEX index_name(column(length));
3.创建表时添加索引
CREATE TABLE 'table' (
'id 'int(11) NOT NULLAUTO_INCREMENT,
'ititle' char(255) CHARACTER SET utf8 COLLATE utf8_general ci NOT NULL,
'content' text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
'time' int(10) NULL DEFAULT NULL,
PRIMARY KEY (id),
INDEX index_name(title(length))
用法示例:
1.直接创建索引
mysql> desc user; 描述user表
mysql> create fulltext index full on user(name (64));字段加上长度
mysql> show index from user;查看索引
mysql> create fulltext index full on user(age (3));
age为int类型不支持创建全文索引
ERROR 1283 (HY000): Column 'age' cannot be part of FULLTEXT index
查看索引语法
show index from table_name;
show keys from table_name;
用法示例:
show index from fruits;
show keys from fruits;
删除索引的语法
drop index index_name on table_name;
ALTER TABLE table_name DROP INDEX index_name;
用法示例:
drop index putong on fruits;
mysql> show index from user; 查看索引
mysql> alter table user drop index full;删除表user中full索引
mysql> show index from user;
表的主键,外键(约束表的一致性)必须有索引
记录数超过300行的表应该有索引
经常与其他表进行连接的表,在连接字段上应该建立索引
唯一性太差的字段(如性别,年龄)不适合建立索引
更新太频繁地字段不适合创建索引
经常出现在where子句中的字段,特别是大表的字段,应该建立索引
索引应该建在选择性高的字段上
索引应该建在小字段上,对于大的的文本字段甚至超长字段,不要建索引
是一种机制、一个操作序列,包含了一-组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行, 要么都不执行
是一个不可分割的工作逻辑单元,在数据库系统.上执行并发操作时,事务是最小的控制单元
适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
通过事务的整体性以保证数据的一致性
A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏数据,但事务B良心发现,又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结果就是事务A读取了此次的脏数据,称为脏读。
事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间。而在事务A第一次读取数据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,称为不可重复读。
事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,称为幻读。
事务是一个完整的操作,事务的各元素是不可分的
事务中的所有元素必须作为一个整体提交或回滚(回到事务开始前状态)
如果事务中的任何元素失败,则整个事务将失败
当事务完成时,数据必须处于一致状态
在事务开始前,数据库中存储的数据处于一致状态
在正在进行的事务中,数据可能处于不一致的状态
当事务成功完成时,数据必须再次回到已知的一致状态
对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
指不管系统是否发生故障,事务处理的结果都是永久的
一旦事务被提交,事务的效果会被永久地保留在数据库中
在开始到提交之间的操作,在提交前的操作仅自己本地可见,不会对数据库产生影响,事务产生的数据变化取决于提交
创建另一个新的任务窗口(会话2)
此时查看数据一致
会话1上
mysql> select * from apple; 查询所有字段
mysql> delete from apple where name='big'; 删除apple表中的name字段中的big数据
mysql> select * from apple;查询所有字段
[root@server1 ~]# mysql -uroot -pabc123 登录数据库
mysql> use tree; 使用数据库
mysql> select * from apple; 查询所有字段
mysql> select * from apple; 查询所有字段
mysql> show variables like 'autocommit'; 查看默认自动提交状态
手动对事务进行控制的方法
事务处理命令控制事务
begin: 开始一个事务
commit: 提交一个事务
rollback: 回滚一个事务
使用set命令进行控制
set autocommit=0: 禁止自动提交(可选提交/不提交,没有commit提交,手动,可指定多条语句一个事务,不自动提交,需自己打commit提交)
set autocommit=1: 开启自动提交(默认自动打commit提交,每条语句都是一个事务,且自动提交)
用法示例:
进行对自动提交关闭状态下
编辑配置数据,一致性情况
mysql> set autocommit=0; 禁止自动提交
mysql> show variables like 'autocommit'; 查看默认自动提交状态
mysql> select * from apple; 查询所有字段
mysql> begin;开始一个事务
mysql> delete from apple where id=1; 删除来自表apple中的条件是id为1的数据
mysql> select * from apple; 查询所有字段
命令已经生效
mysql> select * from apple;查询所有字段
发现数据未删除,仍然存在
mysql> rollback;
mysql> select * from apple;查询所有字段
回滚到删除数据之前,开始begin前
mysql> commit;提交一个事务
mysql> select * from apple;查询所有字段
两边数据一致
会话1上
mysql> begin; 开始一个事务
mysql> delete from apple where id=1;删除来自表apple中的条件是id为1的数据
mysql> select * from apple;查询所有字段
mysql> commit;提交一个事务
mysql> select * from apple;查询所有字段
mysql> select * from apple;
mysql> begin;开始一个事务
mysql> insert into apple values(4,'small',34);插入数据记录到表apple中
mysql> exit 直接退出
[root@server1 ~]# mysql -uroot -pabc123 数据库重新登录
mysql> show variables like 'autocommit'; 查看默认自动提交状态
在自动提交功能关闭情况下,插入数据,不提交,对数据库没有影响,数据库重连,自动提交默认自动开启
mysql> use tree;使用数据库
mysql> insert into apple values(4,'small',34);插入数据记录到表apple中
mysql> select * from apple;查询所有字段
会话2上
mysql> select * from apple;查询所有字段
由此得出在自动提交功能关闭在情况下,操作命令必须commit提交才可以生效,同理要将多个操作命令整合在一起执行,也需要自动提交功能关闭为前提。
配置多个命令执行
mysql> set autocommit=0; 禁止自动提交
mysql> show variables like 'autocommit';查看默认自动提交状态
mysql> begin;开始事务
mysql> insert into apple values(5,'big',50);插入数据记录到表apple中
mysql> insert into apple values(6,'yellow',79);
mysql> select * from apple; 查询所有字段
不提交
会话2上
mysql> select * from apple;查询所有字段
1.MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交
2.事务控制语句
BEGIN或START TRANSACTION 开始一个事务
COMMIT 提交
ROLLBACK 回滚
SAVEPOINT identifier 创建保存点
RELEASE SAVEPOINT identifier 删除保存点
ROLLBACK TO identifier 回滚到指定保存点
SETTRANSACTION 设置事务的隔离级别
解析:
SET TRANSACTION: 用来设置事务的隔离级别。
InnoDB 存储引擎提供事务的隔离级别有
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ和SERIALIZABLE。
查看变量信息
mysql> show variables\G
用法示例:
mysql> savepoint a;创建保存点a
mysql> select * from apple; 查询所有字段
mysql> insert into apple values(7,'green',45);插入数据记录
mysql> select * from apple;查询所有字段
mysql> savepoint b;创建保存点b
mysql> delete from apple where name='small';删除数据字段
mysql> select * from apple;查询所有字段
mysql> savepoint c;
mysql> rollback to c; 回滚到保存点c
mysql> select * from apple; 查询所有字段
mysql> rollback to b; 回滚到保存点b
mysql> select * from apple; 查询所有字段
mysql> rollback to a; 回滚到保存点a
mysql> select * from apple; 查询所有字段
mysql> rollback to c; 回滚到保存点c 报错不存在
mysql> rollback to b; 回滚到保存点b 报错不存在
原因:回滚到保存点只能顺序回滚,不能跳跃回滚,即只能回滚到当前时间点之前的保存点,之后的保存点无法回滚到
1.MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
2.存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
3.MySQL常用的存储引擎:
MyISAM
InnoDB
4.MySQL数据库中的组件,负责执行实际的数据I/O(输入/输出)操作
5.MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
1.MyISAM不支持事务,也不支持外键
2.访问速度快
3.对事务完整性没有要求
4.MyISAM在磁盘上存储成三个文件:
.frm 文件存储表定义
数据文件的扩展名为 .MYD (MYData)
索引文件的扩展名是 .MYI (MYIndex)
5.表级锁定形式,数据在更新时锁定整个表
6.数据库在读写过程中相互阻塞(不能同时进行)
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
7.数据单独写入或读取,速度过程较快且占用资源相对少
8.MyIAM支持的存储格式:
静态表
动态表
压缩表
1.静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空榕在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面的空格会被自动处理掉。
2.动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE 语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
3.压缩表由myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
公司业务不需要事务的支持
单方面读取或写入数据比较多的业务
MyISAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差
1.支持4个事务隔离级别
2.行级锁定,但是全表扫描仍然会是表级锁定
3.读写阻塞与事务隔离级别相关
4.能非常高效的缓存索引和数据
5.表与主键以簇的方式存储
6.支持分区、表空间,类似oracle数据库
7.支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
8.对硬件资源要求还是比较高的场合
1.分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
2.分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
3.分库
一旦分表,一个库中的表会越来越多
4.表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表,所以称作表空间。
一个数据库可以包含多个表空间,一个表空间只能属于一个数据库
一个表空间包含多个数据文件,一个数据文件只能属于一个表空间
1.业务需要事务的支持
2.行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
3.业务数据更新较为频繁的场景
如:论坛,微博等
4.业务数据一致性要求较高
如:银行业务
5.硬件设备内存较大,利用Innodb较好的缓存能力来提高内存利用率,减少磁盘IO的压力
1.需要考虑每个存储引擎提供的核心功能及应用场景
2.支持的字段和数据类型
所有引擎都支持通用的数据类型
但不是所有的引擎都支持其它的字段类型,如二进制对象
3.锁定类型:不同的存储引擎支持不同级别的锁定
表锁定
行锁定
4.索引的支持
建立索引在搜索和恢复数据库中的数据时能显著提高性能
不同的存储弓|擎提供不同的制作索引的技术
有些存储弓|擎根本不支持索引
5.事务处理的支持
提高在向表中更新和插入信息期间的可靠性
可根据企业业务是否要支持事务选择存储引擎
方法1: alter table修改
alter table table_ name engine=引擎;
方法2:
修改my.cnf,指定默认存储引擎并重启服务
default- storage-engine=InnoDB
方法3: create table创建表时指定存储引擎
create table表名
(字段) engine=引擎
用法示例:
方法一
mysql> show engines\G 查看存储引擎
mysql> show create table apple\G 查看表apple的状态信息
mysql> alter table apple engine=MyISAM; 修改表apple的存储引擎
mysql> show create table apple\G 查看表apple的状态信息
方法二
mysql> exit 退出数据库
[root@server1 ~]# vi /etc/my.cnf 编辑配置文件
添加
default-storage-engine=MyISAM
[root@server1 ~]# systemctl restart mysqld 重启服务
[root@server1 ~]# mysql -uroot -pabc123 登录数据库
mysql> show engines\G 查看存储引擎的状态
方法三
mysql> use tree;使用数据库
mysql> create table a1(id int(1)) engine=InnoDB; 创建表指定存储引擎
mysql> create table b1(id int(1));创建表
mysql> show create table a1\G 查看指定表的存储引擎
mysql> show create table b1\G
通过以上对MySQL索引,事务与存储引擎的相应的解析,有利于了解掌握MySQL数据库运用。