计算机协调多个进程或线程并发访问某一种资源的机制
粒度
锁后 只能进行读取 全库的数据备份 从而获取一致性视图
全局锁 flush tables with read lock;
备份 mysqldump -u root -p 12345 database_name > xxx.sql;
(在windows命令行执行)
解锁 unlock tables ;
在innodb引擎中 备份添加参数 --sing-transaction
完成不加锁的一致性备份
每次操作锁住整张表
加锁 lock tables table_name read/write
释放锁 unlock tables
系统自动控制加锁 维护表元数据的数据一致性 在表上有活动事务的时候 不可以对元数据进行写入操作
当对表进行增删改查的时候 自动加锁
解决在执行dml语句中 加的行锁与表锁的冲突 在innodb引擎加入了意向锁 是的表锁不用检查每行数据是否加锁 使用意向锁来减少表锁的检查
兼容问题
**意向共享锁:**与表锁共享锁(read)兼容 与表锁排他锁(write)互斥
**意向排他锁:**与表锁共享锁(read)以及排他锁(write)都互斥 意向锁之间不会互斥
锁住对应数据行的数据
行锁是通过对索引上的索引行加锁来实现的而不是对记录加的锁
sql | 行锁类型 | 说明 |
---|---|---|
insert | 排他锁 | 自动 |
update | 排他锁 | 自动 |
delete | 排他锁 | 自动 |
select | 不加锁 | |
select…lock in share mode | 共享锁 | 手动 |
select…for update | 排他锁 | 手动 |
默认情况下 innodb在repeatable read事务隔离级别运行 innodb使用next-key进行搜索和索引扫描 以防止幻读
间隙锁唯一目的是防止其他事务插入间隙 间隙锁可以共存 一个事务采用的间隙锁不会组织两一个事务在同一个间隙上采用间隙锁
存储正常运行的各种信息
元数据体系 数据库 表 字段类型及访问权限
为服务器运行时提供了一个底层监控的功能 主要用于收集服务器性能参数
包含了一系列方便dba和开发人员利用performance_schema 性能数据库进行性能调优和诊断
-u 指定用户名
-p 指定密码
-h 指定服务器ip或域名
-P 指定连接端口号
-e 执行sql语句并退出(可以在客户端执行sql语句 而不用连接数据库)
执行管理操作的客户端程序 可以用它检查服务器的配置和当前状态 创建并删除数据库等
不指定主机名和端口号 默认本主机3306
服务器生成的二进制文件 需要用到mysqlbinlog管理工具
mysqlbinlog [options] log-files...
-d 指定数据库名称
-o 忽略日志中前n行的命令
-r 将输出的文本格式日志输出到指定文件
-s 显示简单个事 省略一些信息
批量插入
insert into table-name values(1,'tom),(2,'cat)...;
手动事务提交
start transction;
commit
主键顺序插入
load指令
--local-infile
set global local_infile=1
load data local infile 'filename.log' into table 'table_name' fields terminated by ',' lines terminated by '\n';
主键设置原则
需要为排序的字段创建索引
create index index_name on table_name(字段1,字段2)
注意创建字段索引的顺序要与排顺时字段顺序相同 (最左前缀法则)
默认升序排序 asc 降序排序 desc
创建字段索引时可以指定升序降序
如果全部字段遵循一致的排列顺序 则不需要额外指定字段排序
出现 using temporary 临时表 效率极低
创建联合索引 注意最左前缀法则
where 先出现group by后出现 依旧可以满足最左前缀法则
分页查询
大数据量分页 越往后 耗时越长
优化 覆盖索引 子查询
//例子
select * from table_name limit 9000000,10;
//优化
select *from table_name where id in(select id from table_name order by id limit 9000000,10);
//或者
select name1.* from table_name1 name1,(select * from table_name order by id limit 9000000,10) name2 where name1.id=name2.id;
myisam 引擎会把一个表的总行数存在磁盘上 执行count *效率高
innodb 执行count* 时 需要把数据一行一行地从引擎里读出来 然后累计计数
优化思路:自己计数 自己维护
count几种方式
count 主键
count 字段
count *
count 1
count *效率最高 count 1 count主键 count字段
update 条件中没有使用索引的话 会锁住整张表
innodb是针对索引加的锁 不是针对记录加锁 并且索引不能失效 否则行锁升级为表锁