MySQL账户与数据

  1. MySQL用户账户管理
  2. MySQL的数据存储位置
  3. 存储引擎
  4. 数据备份与恢复
  5. 数据导入与导出
  6. MySQL调优
  7. 事务

1. MySQL用户账户管理

  1. 开启MySQL远程连接(改配置文件)
    1. sudo -i
    2. cd /etc/mysql/mysql.conf.d/
    3. cp mysqld.cnf mysqld.cnf.bak2
    4. vi mysqld.cnf
      #bind-address=127.0.0.1
      把前面 # 去掉,保存退出
      vi mysqld.cnf
      按a -> 改内容 -> 按ESC -> 按 shift + : -> wq
    5. /etc/init.d/mysql restart
  2. 用root用户添加授权用户
    1. 用root用户登录mysql
      mysql -uroot -p123456
    2. 授权
    grant 权限列表 on 库名.表名 
    to "用户名"@"%" identified by "密码"
    with grant option;
    权限列表 :all privileges. select. update
    库名.表名 :db4.* . *.*(所有库的所有表)
  3. 示例
    1. 添加授权用户tiger,密码123,对所有库的所有表有所有权限,可从任何IP去连接
    grant all privileges on *.* 
    to "tiger"@"%"
    identified by "123"
    with grant option;
    1. 添加授权用户rabbit,密码123,对db4库所有表只有查询权限,可从任何IP去连接
    grant select on db4.* 
    to "rabbit"@"%" identified by "123"
    with grant option;

2. MySQL的数据

  1. 所有数据都是以文件形式存储在数据库目录下
    /var/lib/mysql
  2. 更改库的默认字符集
    方法:更改配置文件
    1. sudo -i
    2. cd /etc/mysql/mysql.conf.d
    3. cp mysqld.cnf mysqld.cnf.bak
    4. subl mysqld.cnf
    5. 在[mysqld]下:
      character_set_server = utf8
    6. /etc/init.d/mysql restart

3. 锁

  1. 目的 :解决客户端并发访问的冲突问题
  2. 锁分类
    1. 锁类型
      • 读锁(共享锁)
        查询(select):加读锁之后,别人不能更改表记录,但可以进行查询
      • 写锁(互斥锁. 排他锁)
        更新(update):加写锁之后别人不能查. 不能改
    2. 锁粒度
      • 行级锁 :Innodb
        select :加读锁,锁1行
        update :加写锁,锁1行
      • 表级锁 :MyISAM
        select :加读锁,锁1张表
        update :加写锁,锁1张表
        计算机 锁表 耗费的时间比锁行要少

4. 存储引擎(engine :处理表的处理器)

  1. 查看所有存储引擎
    show engines;
  2. 查看已有表的存储引擎
    show create table 表名;
  3. 创建表指定存储引擎
    create table 表名(...)engine=myisam,charset=utf8;
  4. 已有表
    alter table 表名 engine=myisam;

常用存储引擎的特点

  1. InnoDB特点
    1. 支持事务,外键,行级锁
    2. 共享表空间
      表名.frm :表结构和索引信息
      表名.ibd : 表记录
  2. MyISAM特点
    1. 支持表级锁
    2. 独享表空间
      表名.frm :表结构
      表名.MYD :表记录
      表名.MYI :索引信息
  3. Memory特点
    1. 数据存储在内存中,速度快
    2. 服务器重启. MySQL服务重启后表记录消失
  • 如何决定使用哪个存储引擎
    1. 查询操作多的表使用MyISAM(1.表级锁,2. 读锁,别人不能改表,但能查询)
    2. 写操作多的表使用InnoDB(1.行级锁,2.写锁,别人不能查,不能改)

5. 数据备份与恢复

数据备份(mysqldump,在Linux终端操作)

  1. 命令格式
    mysqldump -u用户名 -p 源库名 > 文件名.sql
  2. 源库名的表示方式
    --all-databases 备份所有库
    库名 备份1个库
    -B 库1 库2 库3 备份多个库
    库名 表1 表2 表3 备份多张表
  3. 练习
    1. 备份所有库,放到mydata目录下 :All.sql
      mysqldump -uroot -p --all-databases > All.sql
    2. 备份db4库中的 sheng. city. xian三张表,db4scx.sql
      mysqldump -uroot -p db4 sheng city xian > db4scx.sql
    3. 备份MOSHOU和db4两个库,md.sql
      mysqldump -uroot -p -B db4 MOSHOU > md.sql

数据恢复

  1. 命令格式(Linux终端)
    mysql -u用户名 -p 目标库名 < 文件名.sql
  2. 从所有库备份All.sql中恢复某一个库
    mysql -u用户名 -p --one-database 库名 < All.sql
    mysql -uroot -p --one-database db4 < All.sql
  3. 示例
    1. 在db4.sheng添加一条记录
      insert into sheng values(null,300000,"黑龙江");
    2. 在db4库,新建一张表t888
      create table t888(id int);
    3. 从 db4.sql 恢复db4库
      mysql -uroot -p db4 < db4.sql
      注意 :
  4. 恢复库时,如果恢复到原库会将表中数据覆盖,新增表不会删除
  5. 恢复库时,如果库不存在,则必须先创建空库

6. 数据导入与导出

数据导入

  1. 作用: 把文件系统中内容导入到数据库中
  2. 语法格式
load data infile '绝对路径\文件名'
into table 表名
fields terminated by '分隔符'
lines terminated by '\n';

示例: 将scoretable.csv导入到数据库中

  1. 在数据库中创建对应的表
  2. 查看搜索路径
    show variables like 'secure_file_priv';

    /var/lib/mysql-files

  3. 拷贝文件
    sudo cp ~/scoretable.csv /var/lib/mysql-files
  4. 执行数据导入

数据导出

select ... from 表名
into outfile "文件名"
fileds terminated by "分隔符"
lines terminated by "\n";

查看, 更改文件权限

  1. ls -l score.txt5
    r=4 w=2 x=1
  2. chmod 740 文件名

表的复制

  1. create table 表名 select ... from 表名 where 条件;
  2. 复制表结构
    create table 表名 select ... from 表名 where false;

7. MySQL调优

  1. 创建索引
    在select. where. order by常涉及到的字段建立索引
  2. 选择合适存储引擎
    1. 读操作多 :MyISAM
    2. 写操作多 :InnoDB
  3. SQL语句优化(避免全表扫描)
    1. where子句尽量不使用 != ,否则放弃索引全表扫描
    2. 尽量避免NULL判断,全表扫描
      优化前:
      select number from t1 where number is null;
      优化后:
      在number字段设置默认值0,确保number字段无NULL
      select number from t1 where number=0;
    3. 尽量避免用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;
    4. 模糊查询尽量避免使用前置 %,否则全表扫描
      select variable from t1 where name="secure%";
    5. 尽量避免使用in和not in,否则全表扫描
      优化前 :
      select id from t1 where id in(1,2,3,4);
      优化后 :
      select id from t1 where id between 1 and 4;
    6. 不能使用 select * ...
      用具体字段代替*,不要返回用不到的任何字段

8. 事务和事务回滚

  1. 定义 :一件事从开始发生到结束的整个过程
  2. 作用 :确保数据一致性
  3. SQL命令默认会 autocommit 到数据库执行

事务操作

mysql> begin; //开始事务start transactions; 此时autocommit被禁用
mysql> SQL命令1
mysql> SQL命令2
mysql> SQL命令3
...
mysql> commit; //终止事务, 如果其中有任一条语句失败则rollback;

猜你喜欢

转载自www.cnblogs.com/ravener/p/9657363.html