索引的概念:
总结:索引就是能够使系统更快速查询信息的结构
索引的作用(副作用):
作用:
数据库利用各种快速定位技术,能够大大加快查询速率
当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度
可以降低数据库的IO成本,并且还可以降低数据库的排序成本
通过创建唯一性索引保证数据表数据的唯一性
可以加快表与表之间的连接
在使用分组和排序时,可大大减少分组和排序时间
副作用:
索引需要占用额外的磁盘空间
在插入和修改数据时要花费更多的时间,因为索引也要随之变
创建索引的原则依据:
创建索引:
创建索引并且指向索引的字段 创建索引的时候直接致电给index
修改表的字段来添加索引 alter修改表结构的时候 添加add 添加index
创建表直接创建索引
ps:主键索引直接创建主键即可
普通索引:
① :create index 索引名 on 表名 (字段);
② :alter table 表名 add index 自取 (字段)
③ :create table 表名(id int not null,name varchar(5),index 索引名 (字段));
唯一索引:
① :create unique 索引名 on 表名 (字段);
② :alter table 表名 add unique 索引名(字段);
组合索引:
create table 表名(id int not null,name varchar(10),index 索引名 (字段1,字段2));
select 字段1 字段2 from 表名 #查询(查询时字段的顺序要和创建时一致,否则无效)
查询索引:
1、show create table 表名;
2、show index from 表名;
3、show index from 表名\G; #竖向显示表的索引信息
4、show keys from 表名;
5、show keys from 表名\G;
删除索引:
1、直接删除索引: drop index 索引名 on 表名;
2、修改表的方式删除索引:alter table 表名 drop index 索引名;
3、删除主键索引:alter table 表名 drop primary key;
事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
事务是通过事务的整体性以保证数据的一致性
总结:所谓事务,是一个操作序列,这些操作要么都执行,要么都不执行
事务的ACID特点:
没有提交的数据可能会发生rollback(回滚),
比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读
3、幻读:事务B前后两次读取同一范围的数据,后一次读取总数和前一次不一致,称为幻读
4、丢失更新:事务A去撤销事务时,把已提交的事务B的更新数据覆盖,称为丢失更新
1、read uncommitted :安全性最差,但是性能最好 (不使用)
2、read committed (提交读) :安全性较差,性能较好
3、repeatable read (可重复度) :安全性较高,性能较差
4、serializable串行化 :安全性最高,性能最差(不使用)
全局级:对所有的会话有效
会话级:只对当前的会话有效
查询全局事务隔离级别:
show global variables like '%isolation%';
select @@global.tx_isolation;
设置全局事务隔离级别:
set global transaction isolation level read committed;
查询会话事务隔离级别:
show session variables like '%isoation%';
select @@session.tx_isolation;
select @@tx_isolation;
设置会话事务隔离级别
set session transaction isolation level read committed;
事务控制语句:
begin 或 start transaction:显式地开启一个事务
rollback 或 rollback work:回滚 返回结束数据的修改,返回修改之前的数据记录
commit 或 commit work:提交事务,并使已对数据库进行的所有修改变为永久性的
savepoint S1:创建一个回滚点,一个事务中可以有多个savepoint;
S1代表回滚点名称
rollback to S1:把事务回滚到标记点
使用 set 设置控制事务
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值
如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit
三、MySQL 存储引擎
存储引擎概念
MySQL常用的存储引擎:MyISAM 和 InnoDB
MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
访问速度快,对事务完整性没有要求
MyISAM 适合查询、插入为主的应用场景
MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
1、静态表 (char):静态表时默认的存储格式,字段都是非可变字段
2、动态表 (varchar):包含可变字段,记录不是固定长度的
3、压缩表 (myisamchk):每个记录都是被独立压缩的,创一个表就会压缩
读或写无法同时进行,好处是分开执行时,速度快、资源占用相对较少
Myisam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景
特点:支持事务,支持4个事务隔离级别
死锁:当两个请求分别访问/读取2行记录,同时又需要读取对方的记录数据,因为(行锁的限制)而造成了阻塞的现象
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
查看系统支持的存储引擎
show engines;
查看表使用的存储引擎
方法一:
show table status from 库名 where name='表名'\G;
方法二:
use 库名;
show create table 表名;
修改存储引擎
方法一:
通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;
show create table 表名
方法二:
通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
quit
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
systemctl restart mysqld.service
修改完记得重启mysql服务
#注意:此方法只对修改了配置文件并重启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;