事务

使用方式

1
2
3
start transaction	# 开启事物
commit # 提交事务
rollback # 回滚

四大特性

  1. 原子性:事务是一个整体,只能一起成功或者一起失败
  2. 一致性:事务完成时,必须使所有的数据都保持一致状态
  3. 隔离性:保证事务不受外界操作影响
  4. 持久性:事物一旦提交或者回滚,对数据改变是永久的

并发问题

  1. 脏读:事务中读到其他事务中还未提交的数据
  2. 不可重复读:事务中俩次查询时数据被改变则查询结果不相同
  3. 幻读:解决不可重复读后,在事物查询完无数据时其他事物增加该数据则会造成查不到该数据但是插入时显示数据存在

隔离级别

查看隔离级别

1
select @@transaction_isolation;

修改隔离级别

1
set {session|global} transaction isolation level read uncommitted

隔离级别及解决问题

隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed(Oracle默认) x
Repeatable Read(MySQL默认) x x
Serializable x x x

存储引擎

简介

​ 存储引擎就是村粗数据、建立索引、更新/查询等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

指定存储引擎

1
2
3
4
create table mytable(
id int,
name varchar(15)
)engine = MyISAM;

InnoDB

​ InnoDB是一种高可靠和高性能的通用存储引擎,在MySQL5.5之后成为MySQL默认引擎。

特点:

1. 支持事物
1. 支持行级锁
1. 支持外键

索引

简介

​ 索引本质是将建立索引的字段通过使用相适应的数据结构(如二叉树)存储以提高查询孙读。

优点:

1. 提高数据检索效率,降低IO成本。
1. 通过索引列对数据进行排序能降低排序的成本。

缺点:

  1. 索引列占用空间。
  2. 提高查询效率的同时降低了更新表的速度。
索引 说明 特点
主键索引 根据主键建立的索引 默认自动创建,只能有一个
唯一索引 避免某列有重复数据 多个
常规索引 快速定位 多个
全文索引 查找文本中的关键字 多个

聚集索引:只能存在一个,一般是主键或者第一个唯一索引,索引存放有完整的一整条数据。

二级索引:可以有多个,索引一般关联主键,通过二级索引确定查找数据的主键再通过聚集索引查找完整数据。

索引语法

1
2
3
4
5
6
7
8
9
# 创建
CREATE [ UNIQUE|FULLTEXT ] INDEX index_name ON table_name(index_col_name,)

# 查看索引
SHOW INDEX FROM table_name;

# 删除索引
DROP INDEX index_name ON table_name;

SQL性能分析

查看NSERT、UPDATE、DELETE、SELECT访问频率

1
2
# (7个下划线)
SHOW [ SESSION|GLOBAL ] STATUS LIKE 'Com_______';

慢查询日志

在my.cnf中开启慢查询日志

1
2
3
4
5
6
# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2s,超过该时间被视为慢日志
long_query_time=2
# 配置慢日志存储路径
slow-query-log-file=/opt/mysql/log

通过profile查看耗时详情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看当前数据库是否支持profile操作
select @@hava_profiling;

# 查看是否打开profile开关
select @@profiling;

# 开启profile
set profiling = 1;

# 查看耗时详情
show profiles;

# 查看指定query_id的SQL语句各阶段的耗时情况
show profile for query id;

explain执行计划

1
explain select * from user;
字段 含义
id 查询顺序,数字越大越先查询
select_type 表示查询类型
type 表示连接类型[NULL|system|const|eq_ref|ref|range|index|all]性能由好到差
possible_key 在这张表中可能用到的索引
key 实际用到的索引
key_len 使用的索引字段最大长度
row 必须查询行数,是一个估计值
filtered 表示行数占需要读取行数的百分比,越大越好

索引使用

索引最左前缀法则:查询从索引最左侧开始。如果跳过索引中的某一列索引将部分失效,如果不包含最左列则索引失效。

范围查询:范围查询中>右侧的字段索引失效,>=则不会

SQL优化

视图/存储过程/触发器

InnoDB引擎

MySQL管理