MySQL数据库之索引事务存储引擎
Posted 28线不知名云架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库之索引事务存储引擎相关的知识,希望对你有一定的参考价值。
一、索引的概念
①索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。
②使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
③索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
④索引是表中一列或者若干列值排序的方法。
⑤建立索引的目的是加快对表中记录的查找或排序
二、索引的作用
- 设置了合适的索引之后,数据库利用定位技术,加快查询速率
- 当表很大的时候或者内容很多的时候,或者查询涉及到多个表时,使用索引可使查询加快成干倍
- 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
- 通过创建唯一性索引保证数据表数据的唯一性
- 可以加快表与表之间的连接
- 在使用分组和排序时,可大大减少分组和排序时间
- 需要额外的磁盘空间
索引的副作用
- 索引需要占用额外的磁盘空间。
- 对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
- 而 InnoDB 引擎的表数据文件本身就是索引文件。 - 在插入和修改数据时要花费更多的时间,因为索引也要随之变动。
三、索引的分类
3.1、普通索引
最基本的索引类型,没有唯一性之类的限制
①直接创建
create index 索引名 on 表名 (列名[(length)]);
(列名[(length)]:length 为可选项,如果忽略 length 的值,则使用整个列的值作为索引。
如果指定使用列的前 length 个字符来创建索引,这样有利于减小索引文件的大小。
索引名建议以 “index” 结尾。
例:create index phone_index on member (phone);
select phone from member;
show create table member;
②修改表的方式创建
alter table 表名 add index 索引名 (列名);
例:alter table member add index id_index (id);
select id from member;
select id,name from member;
③创建表的时候指定索引
create table 表名 (字段1 数据类型,字段2 数据类型,index 索引名 (列名));
例:create table test(id int(4) not null,name varchar(10) not null,cardid varchar(18) not null,index id_index (id));
show create table test;
3.2、唯一索引
唯一索引允许有空值(注意和主键不同)
①直接创建唯一索引
create unique index 索引名 on 表名 (列名);
例:select * from member;
create unique index address_index on member (address);
create unique index name_index on member (name);
show create table member;
②修改表方式创建
alter table 表名 add unique 索引名 (列名);
例:alter table member add unique cardid_index (cardid);
③创建表的时候指定
create table 表名 (字段1 数据类型,字段2 数据类型,unique 索引名 (列名));
例:create table amd2 (id int,name varchar(20),unique id_index (id));
show creat table amd2;
3.3、主键索引
唯一 非空
①创建表的时候指定索引
create table 表名 (字段1 数据类型,字段2 数据类型,primary key (列名));
例:create table test1 (id int primary key,name varchar(20));
create table test2 (id int,name varchar(20),primary key (id));
show create table test1;
show create table test2;
②修改表方式创建索引
alter table 表名 add primary key (列名);
3.4、组合索引
①可以是单列上创建的索引,也可以是在多列上创建的索引
②需要满足最左原则,因为select语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效
①创建表的时候指定组合索引
create table 表名 (字段1 数据类型,字段2 数据类型,index 索引名 (列名1,列名2));
select * from 表名 where 列名1='...' and(or) 列名2='...'
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';
例:create table amd1 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));
show create table amd1;
insert into amd1 values(1,'zhangsan','123123');
select * from amd1 where name='zhangsan' and id=1;
②修改表方式创建组合索引
create table 表名 (字段1 数据类型,字段2 数据类型);
alter table 表名 add primary key (列名);
例:select * from member;
create fulltext index remark_index on member (remark);
3.5、全文索引
①适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。
②在 mysql5.6 版本以前 fulltext 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 fulltext 索引。
③全文索引可以在 char、varchar 或者 text 类型的列上创建。每个表只允许有一个全文索引。
直接创建索引
create fulltext index 索引名 on 表名 (列名);
修改表方式指定全文索引
alter table 表名 add fulltext 索引名 (列名);
创建表的时候指定全文索引
create table 表名 (字段1 数据类型,字段2 数据类型,fulltext 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT
使用全文索引查询
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');
例:select * from member where match(remark) against('this is vip');
四、索引的查看
show index from 表名;
show index from 表名\\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\\G;
五、索引的删除
①直接删除索引
drop index 索引名 on 表名;
例:drop index name_index on member;
②修改表方式删除索引
alter table 表名 drop index 索引名;
例:alter table member drop id_index;
show index from member;
③删除主键索引
alter table 表名 drop primary key;
六、MySQL事务概述
1.是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行, 要么都不执行
2.是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
3.适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
4.通过事务的整体性以保证数据的一致性
6.1事务的四个特点(ACID)
原子性、唯一性、隔离性、持久性
6.2事务不一致产生的四个错误
脏读、幻读、不可重复读、丢失更新
6.3Mysql及事物隔离级别
PS:mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed
七、事物的控制语句
BEGIN 或 START TRANSACTION:显式地开启一个事务。
COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。
实例:
create database SCHOOL;
use SCHOOL;
create table CLASS(
id int(10) primary key not null,
name varchar(40),
money double
);
insert into CLASS values(1,'A',1000);
insert into CLASS values(2,'B',1000);
select * from CLASS;
①测试提交事务
begin;
update CLASS set money= money - 100 where name='A';
select * from CLASS;
commit;
quit
mysql -u root -p
use SCHOOL;
select * from CLASS;
②测试回滚事务
begin;
update CLASS set money= money + 100 where name='A';
select * from CLASS;
rollback;
quit
mysql -u root -p
use SCHOOL;
select * from CLASS;
③测试多点回滚
begin;
update CLASS set money= money + 100 where name='A';
select * from CLASS;
SAVEPOINT S1;
update CLASS set money= money + 100 where name='B';
select * from CLASS;
SAVEPOINT S2;
insert into CLASS values(3,'C',1000);
select * from CLASS;
ROLLBACK TO S1;
select * from CLASS;
④使用 set 设置控制事务
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值
- 如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入 rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
- 如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。 当然无论开启与否,begin; commit|rollback; 都是独立的事务。
use SCHOOL;
select * from CLASS;
SET AUTOCOMMIT=0;
SHOW VARIABLES LIKE 'AUTOCOMMIT';
update CLASS set money= money + 100 where name='B';
select * from CLASS;
quit
mysql -u root -p
use SCHOOL;
select * from CLASS;
八、存储引擎
8.1、概念
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
MySQL常用的存储引擎
- MyISAM:擅长于处理“读”的任务,比如select
- InnoDB:功能性而言侧重于写的任务,比如insert、update、alter
8.2.1 MyISAM特点
- MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
- 访问速度快,对事务完整性没有要求
- MyISAM适合查询、插入为主的应用
- MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
①.frm:文件存储表结构的定义
②.MYD (MYData):数据文件的扩展名为
③.MYI (MYIndex):索引文件的扩展名
8.2.2 MyISAM的功能
表级锁定形式,数据在更新时锁定整个表
- 数据库在读写过程中相互阻塞;即串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
①会在数据写入的过程阻塞用户数据的读取
②也会在数据读取的过程中阻塞用户的数据写入
- 特性(优点):数据单独写入或读取,速度过程较快且,占用资源相对少
8.2.3 支持3种不同的存储格式
①静态表
②动态表
③压缩表
8.2.4 适用的生产场景
- 公司业务不需要事务的支持;特别不适合在银行、电商、证券使用
- 单方面读取或写入数据比较多的业务
- MyISAM存储引擎数据读写都比较频繁场景不适合
- 使用读写并发访问相对较低的业务(纯读、纯写高并发也可以)
- 数据修改相对较少的业务
- 对数据业务一致性要求不是非常高的业务
- 硬件资源比较差的机器可以用MyISAM
8.3 InnoDB引擎
8.3.1 InnoDB特点
- 支持事务,支持4个事务隔离级别
- 读写阻塞与事务隔离级别相关
- 能非常高效的缓存索引和数据
- 表与主键以簇的方式存储
- 支持分区、表空间,类似oracle数据库
- 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
8.3.2 应用场景
- 对硬件资源要求还是比较高的场合
- 行级锁定,但是全表扫描仍然会是表级锁定,如update table set a=1 where user like ‘%lic%’;
8.4 InnoDB与MyISAM的区别
①InnoDB 中不保存表的行数,如select count() from table; 时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当count ()语句包含where 条件时MyISAM也需要扫描整个表
②对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM中可以和其他字起 建立组合索引
③清空整个表时,InnoDB 是一一行一行的删除,效率非常慢。MyISAM 则会重建表
九、存储引擎基本命令操作
9.1查看系统支持的存储引擎
show engines;
9.2查看表使用的存储引擎
方法一
show table status from 库名 where name='表名'\\G;
例:show table status from SCHOOL where name='CLASS'\\G;
方法二
use 库名;
show create table 表名;
例:use SCHOOL;
show create table CLASS;
9.3 修改存储引擎
方法一:通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;
例:use SCHOOL;
alter table CLASS engine=myisam;
show create table CLASS;
方法二:通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
quit
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
systemctl restart mysqld.service
#注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
systemctl restart mysqld.service
修改完记得重启mysql服务
方法三:通过 create table 创建表时指定存储引擎
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;
例:mysql -u root -p
use SCHOOL;
create table hellolic (name varchar(10),age char(4))engine=myisam;
方法四:Mysql_convert_table_format转化存储引擎
Mysql-convert_table_format-user=root-password=密码
-sock=/tmp/mysql.sock -engine=引擎 库名 表名
以上是关于MySQL数据库之索引事务存储引擎的主要内容,如果未能解决你的问题,请参考以下文章