MySQL介绍
什么是MySQL?
一个轻量级的关系型数据库
为什么使用MySQL?
开源免费,高性能,稳定性高,易维护
MySQL基础架构
查询执行计划
常用存储引擎
myisam
表锁 不支持事务 非簇表
innodb
行锁 支持4种隔离级别事务(MVCC) 簇表
archive
zlib压缩 只支持SELECT和INSERT
基础概念
MySQL 数据库,物理存在的操作系统文件集合
MySQL Server,管理MySQL数据的系统
MySQL 实例,MySQL进程以及其持有的内存结构,IP:PORT
SQL (Structured Query Languange)
DDL(Data Defination Language)
create table xxx alter table xxx drop table xxx
online DDL
- MySQL 5.6以上支持在线DDL,但字符串长度在256前后变更,导致写锁
- 请让DBA使用percona-toolkit(PT)执行
- 请在低峰执行
DML(Data Manipulation Language)
CURD语句: Replace into xxx Insert Ignore into xxx
InnoDB索引
B 树
聚簇索引 优点:主键范围扫描 缺点:更新成本相对较高
索引场景
- 前导列(最左前缀原则)
- 索引列上范围查找
- 复合索引
Explain
EXPLAIN SELECT XXXX
代码语言:javascript复制select employees.* from employees where emp_no in
(select emp_no from dept_emp where dept_no = 'd001') ;
show warngings 可以查询优化器优化之后的SQL
id: 执行顺序(ID相同,从上往下) type: ALL->index->range->ref->eq_ref->const,system->null rows: 预估需要扫描的行数 possible keys:可能使用的索引 key:实际使用的索引
自增主键
auto_increment_offset 偏移量 auto_increment_increment 自增值 (默认6字节整形)
简单全局唯一ID
代码语言:javascript复制create table sequence(id int unsigned not null);
insert into sequence values(0);
update sequence set id = last_insert_id(id 1);
select last_insert_id();
字符集
统一设置UTF8/UTF8MB4(MySQL 5.5 )
代码语言:javascript复制show character set;
校对规则
默认: utf8_general_ci 不区分大小写
utf8_bin:区分大小写(select * from test where region='cn' collate utf8_bin;
)
设计规范
- 自增ID主键
- 设置default not null
- 必须设置默认值
- 软删除代替硬删除
- 使用update_time on update current_timestamp
- 字段注释
- 避免表名过长(部分DBA工具限制)
安全
权限: 申请适当权限(CURD)
代码语言:javascript复制grant select , update , delete on employees
to test_rw@'127.0.0.1' identified by 'test123' ;
SQL注入: 使用占位参数化查询
慢查询
开启慢查询
代码语言:javascript复制mysql> show variables like 'slow_query%' ;
--------------------- --------------------------------------
| Variable_name | Value |
--------------------- --------------------------------------
| slow_query_log | ON |
| slow_query_log_file | /usr/local/mysql/data/slow-query.log |
--------------------- --------------------------------------
代码语言:javascript复制mysql> show variables like 'long_query_time' ;
----------------- ----------
| long_query_time | 0.500000 |
----------------- ----------
分析慢查询
代码语言:javascript复制# User@Host: root[root] @ localhost [127.0.0.1] Id: 2
# Query_time: 2.397048 Lock_time: 0.001538 Rows_sent: 1 Rows_examined: 10810030
SET timestamp=1566225900;
select count(*) from employees;
# User@Host: test_rw[test_rw] @ localhost [127.0.0.1] Id: 17
# Query_time: 2.410302 Lock_time: 0.000069 Rows_sent: 2188111 Rows_examined: 2188111
SET timestamp=1566230367;
select *from employees;
使用mysqldumpslow分析慢查询
查询时间最长:mysqldumpslow -s t -t 1 /usr/local/mysql/data/slow-query.log
事务和锁
事务的ACID
原子性,一致性,隔离性,持久性
隔离级别
- read uncommitted
- read committed
- repeatable read
- serializable
多版本并发控制(MVCC)
- InnoDB multiversion concurrency control (MVCC)
- 快照读
- 版本链
- read view
InnoDB锁
表锁
1.读锁: lock tables [table _name] read; 2. 表锁:lock tables [table_name] write; 3.全局: flush tables with read lock; 4.释放锁:unlock tables;
行锁
1.记录锁(record lock) 2. 间隙锁(gap lock) 3. next key锁
死锁
1.禁止抢占 2.持有和等待 3.互斥 4循环等待
MySQL监控
参数和运行状态
- show variables like ‘%参数%’;
- show full processlist;
- show engine innodb status
性能
- show global status like ‘com_%’
- show global status like ‘select%’
- information_schema.tables
常见问题
too many connections
- 查看当前连接数 show global variables like ‘Threads_connected’;
- show full processlist ;
- 修改最大连接数max_connections
MySQL has gone away
- show variables like ‘wait_timeout’ ;