- MySQL用户账户管理
- MySQL的数据存储位置
- 锁
- 存储引擎
- 数据备份与恢复
- 数据导入与导出
- MySQL调优
- 事务
1. MySQL用户账户管理
- 开启MySQL远程连接(改配置文件)
- sudo -i
- cd /etc/mysql/mysql.conf.d/
- cp mysqld.cnf mysqld.cnf.bak2
- vi mysqld.cnf
#bind-address=127.0.0.1
把前面 # 去掉,保存退出
vi mysqld.cnf
按a -> 改内容 -> 按ESC -> 按 shift + : -> wq - /etc/init.d/mysql restart
- 用root用户添加授权用户
- 用root用户登录mysql
mysql -uroot -p123456 - 授权
grant 权限列表 on 库名.表名 to "用户名"@"%" identified by "密码" with grant option; 权限列表 :all privileges. select. update 库名.表名 :db4.* . *.*(所有库的所有表)
- 用root用户登录mysql
- 示例
- 添加授权用户tiger,密码123,对所有库的所有表有所有权限,可从任何IP去连接
grant all privileges on *.* to "tiger"@"%" identified by "123" with grant option;
- 添加授权用户rabbit,密码123,对db4库所有表只有查询权限,可从任何IP去连接
grant select on db4.* to "rabbit"@"%" identified by "123" with grant option;
2. MySQL的数据
- 所有数据都是以文件形式存储在数据库目录下
/var/lib/mysql - 更改库的默认字符集
方法:更改配置文件- sudo -i
- cd /etc/mysql/mysql.conf.d
- cp mysqld.cnf mysqld.cnf.bak
- subl mysqld.cnf
- 在[mysqld]下:
character_set_server = utf8 - /etc/init.d/mysql restart
3. 锁
- 目的 :解决客户端并发访问的冲突问题
- 锁分类
- 锁类型
- 读锁(共享锁)
查询(select):加读锁之后,别人不能更改表记录,但可以进行查询 - 写锁(互斥锁. 排他锁)
更新(update):加写锁之后别人不能查. 不能改
- 读锁(共享锁)
- 锁粒度
- 行级锁 :Innodb
select :加读锁,锁1行
update :加写锁,锁1行 - 表级锁 :MyISAM
select :加读锁,锁1张表
update :加写锁,锁1张表
计算机 锁表 耗费的时间比锁行要少
- 行级锁 :Innodb
- 锁类型
4. 存储引擎(engine :处理表的处理器)
- 查看所有存储引擎
show engines; - 查看已有表的存储引擎
show create table 表名; - 创建表指定存储引擎
create table 表名(...)engine=myisam,charset=utf8; - 已有表
alter table 表名 engine=myisam;
常用存储引擎的特点
- InnoDB特点
- 支持事务,外键,行级锁
- 共享表空间
表名.frm :表结构和索引信息
表名.ibd : 表记录
- MyISAM特点
- 支持表级锁
- 独享表空间
表名.frm :表结构
表名.MYD :表记录
表名.MYI :索引信息
- Memory特点
- 数据存储在内存中,速度快
- 服务器重启. MySQL服务重启后表记录消失
- 如何决定使用哪个存储引擎
- 查询操作多的表使用MyISAM(1.表级锁,2. 读锁,别人不能改表,但能查询)
- 写操作多的表使用InnoDB(1.行级锁,2.写锁,别人不能查,不能改)
5. 数据备份与恢复
数据备份(mysqldump,在Linux终端操作)
- 命令格式
mysqldump -u用户名 -p 源库名 > 文件名.sql - 源库名的表示方式
--all-databases 备份所有库
库名 备份1个库
-B 库1 库2 库3 备份多个库
库名 表1 表2 表3 备份多张表 - 练习
- 备份所有库,放到mydata目录下 :All.sql
mysqldump -uroot -p --all-databases > All.sql - 备份db4库中的 sheng. city. xian三张表,db4scx.sql
mysqldump -uroot -p db4 sheng city xian > db4scx.sql - 备份MOSHOU和db4两个库,md.sql
mysqldump -uroot -p -B db4 MOSHOU > md.sql
- 备份所有库,放到mydata目录下 :All.sql
数据恢复
- 命令格式(Linux终端)
mysql -u用户名 -p 目标库名 < 文件名.sql - 从所有库备份All.sql中恢复某一个库
mysql -u用户名 -p --one-database 库名 < All.sql
mysql -uroot -p --one-database db4 < All.sql - 示例
- 在db4.sheng添加一条记录
insert into sheng values(null,300000,"黑龙江"); - 在db4库,新建一张表t888
create table t888(id int); - 从 db4.sql 恢复db4库
mysql -uroot -p db4 < db4.sql
注意 :
- 在db4.sheng添加一条记录
- 恢复库时,如果恢复到原库会将表中数据覆盖,新增表不会删除
- 恢复库时,如果库不存在,则必须先创建空库
6. 数据导入与导出
数据导入
- 作用: 把文件系统中内容导入到数据库中
- 语法格式
load data infile '绝对路径\文件名'
into table 表名
fields terminated by '分隔符'
lines terminated by '\n';
示例: 将scoretable.csv导入到数据库中
- 在数据库中创建对应的表
查看搜索路径
show variables like 'secure_file_priv';/var/lib/mysql-files
- 拷贝文件
sudo cp ~/scoretable.csv /var/lib/mysql-files 执行数据导入
数据导出
select ... from 表名
into outfile "文件名"
fileds terminated by "分隔符"
lines terminated by "\n";
查看, 更改文件权限
- ls -l score.txt5
r=4 w=2 x=1 - chmod 740 文件名
表的复制
- create table 表名 select ... from 表名 where 条件;
- 复制表结构
create table 表名 select ... from 表名 where false;
7. MySQL调优
- 创建索引
在select. where. order by常涉及到的字段建立索引 - 选择合适存储引擎
- 读操作多 :MyISAM
- 写操作多 :InnoDB
- SQL语句优化(避免全表扫描)
- where子句尽量不使用 != ,否则放弃索引全表扫描
- 尽量避免NULL判断,全表扫描
优化前:
select number from t1 where number is null;
优化后:
在number字段设置默认值0,确保number字段无NULL
select number from t1 where number=0; - 尽量避免用or连接条件,否则全表扫描
优化前:
select id from t1 where id=10 or id=20;
优化后:
select id from t1 where id=10
union all
select id from t1 where id=20; - 模糊查询尽量避免使用前置 %,否则全表扫描
select variable from t1 where name="secure%"; - 尽量避免使用in和not in,否则全表扫描
优化前 :
select id from t1 where id in(1,2,3,4);
优化后 :
select id from t1 where id between 1 and 4; - 不能使用 select * ...
用具体字段代替*,不要返回用不到的任何字段
8. 事务和事务回滚
- 定义 :一件事从开始发生到结束的整个过程
- 作用 :确保数据一致性
- SQL命令默认会 autocommit 到数据库执行
事务操作
mysql> begin; //开始事务start transactions; 此时autocommit被禁用
mysql> SQL命令1
mysql> SQL命令2
mysql> SQL命令3
...
mysql> commit; //终止事务, 如果其中有任一条语句失败则rollback;