04_mysql高级

视图

  • 视图是什么?

    • 通俗的说,视图就是一条select语句执行后返回的结果集,所以我们在创建视图的时候,主要的工作就落在创建这条sql查询语句上。
    • 视图是对于若干张基本表的引用,一张虚拟的表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变。)
    • 方便操作,特别是查询操作,减少复杂的sql语句,增强可读性。
  • sql语句

    • 创建视图 建议以v_开头
      create view 视图名称 as select ... ;
    • 查看视图 查看表也会将所有视图列出来
      show tables;
    • 使用视图 视图的作用就是查询
      select * from v_stu_score;
    • 删除视图
      drop view 视图名称;
  • 视图作用

    • 提高了重用性,就像一个函数
    • 对数据库重构,却不影响程序的运行
    • 提高了安全性能,可以对不同用户
    • 让数据更加清晰

事务

  • 为什么要有事务?

    • 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,他是一个不可分割的工作单位。例如:银行转账,从一个账号扣款并使另一个账号赠款,这两个操作要么都执行,要么都不执行。
  • 事务的四大特性(简称ACID)

    • 原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分,这就是事务的原子性。
    • 一致性(Consistency):数据库总是从一个状态转换到另一个状态。即提交成功后的一种状态,和提交未成功回滚到的之前状态,没有其他情况。
    • 隔离性(Isolation):一个事务所做的修改在commit之前,其他对该数据库的操作无效,会是等待的,类似锁。也可以说对其他事务是不可见的。在转账例子中,在整个事务没有commit之前,他银行账户钱不会增加或者减少。
    • 持久性(Durability):一旦事务提交,就会永久保存到数据库。
  • sql语句

    • 开启事务
      begin; 或者 start transaction;
    • 提交事务
      commit
    • 回滚事务
      rollback;
  • 例子:

    start transaction;
    select balance from checking where customer_id = 10223235;
    update checking set balance = balance - 200 where customer_id = 10223235;
    update savings sert balance = balance + 200 where customer_id = 10223235;
    commit;
    
  • 注意:

    • 修改数据的命令会自动触发事务,包括insert、update、delete
    • 而在sql语句中有手动开启事务的原因是:可以进行多次数据的修改,如果成功一起成功,否则一起回滚到之前的数据。

索引

  • 索引是什么?

    • 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),他们包含对数据表里所有数据记录的引用指针。
    • 通俗的来说:数据库索引像是一本书前面的目录,能加快查询的速度。
  • sql语句

    • 查看索引
      show index from 表名;
      注意:一个表创建的主键和外键,也是索引。
    • 创建索引
      create index 索引名称 on 表名(字段名称(长度));
      注意:
      • 如果指定字段是char或者varchar,需要指定长度,建议长度与定义字段时的长度一致。
      • 字段类型如果不是字符串,可以不填写长度部分。
    • 删除索引
      drop index 索引名称 on 表名;
  • 实例

    • 创建表
      create table test_index(title varchar(10));
    • 插入数据
    from pymysql import connect
    
    def main():
        # 创建Connection连接
        conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
        # 获得Cursor对象
        cursor = conn.cursor()
        # 插入10万次数据
        for i in range(100000):
        cursor.execute("insert into test_index values('ha-%d')" % i)
    # 提交数据
        conn.commit()
    if __name__ == "__main__":
        main()
    
    • 测试
      • 开启运行时间检测:
        set profiling = 1;
      • 查询:
        select * from test_index where title='ha-99999';
      • 查看执行时间:
        show profiles;
      • 创建索引:
        create index title_index on test_index(title(10));
      • 执行查询语句:
        select * from test_index where title='ha-99999';
      • 再次查看执行时间:
        show profiles;
  • 注意

    • 索引创建太多会影响更新和插入的速度,因为他需要同样更新每个索引文件。
    • 对于一个经常需要更新和插入的表格,就没有必要为一个很少使用where字段单独建立索引。
    • 对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
    • 建立索引会占用磁盘空间。

账户管理

  • 查看所有用户

    • 所有用户及权限信息存储在mysql数据库的user表中
    • 查看user表结构
      desc user;
      • Host表示允许访问的主机。
      • User表示用户名。
      • authentication_string表示密码,为加密后的值。
    • 查看所有用户
      select host, user, authentication_string from user;
  • 创建账户、授权

    • 使用root用户登录
      mysql -uroot -pxiaoye1014;
    • 创建账户并授权所有权限。
      grant select on jing_dong.* to 'laowang'@'localhost' identified by '123456';
      • 可以操作jing_dong数据库的所有表,方式为:jing_dong.*
      • 访问主机通常可以使用%,表示此账户可以使用任何ip的主机登录访问此数据库。
      • 访问主机可以设置成localhost或者具体ip,表示之后允许本机或者特定主机访问。
      • 如果是赋予所有权限,将select换成all privileges
    • 查看用户哪些权限
      show grants for laowang@localhost;
    • 退出root用户
      quit
  • 账户操作

    • 修改权限
      grant 权限名称 on 数据库 to 账户@主机 with grant option;
    • 修改密码,password()函数进行加密。
    update user set authentication_string=password('新密码') where user='用户名';
    update user set authentication_string=password('123') where user='laowang';
    
    
    • 注意修改完成后需要刷新权限
      flush privileges;
  • 远程登录

    • 修改 /etc/mysql/mysql.conf.d/mysql.cnf 文件
      vim /etc/mysql/mysql.conf.d/mysql.cnf
      • 在bind-addr = 127.0.0.1 前用#注释
    • 重启mysql
      service mysql restart
    • 在另一台ubuntu中进行连接测试
      mysql -h127.32.25 -ulaowang -pxiaoye1014
      • 默认端口:3306
  • 删除账户

    • 使用root用户登录,可以
    drop user '用户名'@'主机';
    例:
    drop user 'laowang'@'%';
    
    • 使用root登录,也可以
    delete from user where user='用户名';
    例:
    delete from user where user='laowang';
    
    -- 操作结束之后需要刷新权限
    flush privileges
    

MYSQL主从同步配置

  • 主从同步的定义
    主从同步
    使得数据可以从一个数据库服务器复制到其他服务器上,在赋值数据时,一个服务器当做主服务器(master),其余的服务器当做从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连着主服务器,从服务器甚至可以通过拨号断断续续的连接主服务器。通过配置文件,可以指定赋值所有数据库,某个数据库,设置某个数据库上的某个表。
    使用主从同步的好处:

    • 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态的调整从服务器的数量,从而调整整个数据库的性能。
    • 提高数据安全,因为数据已经复制到从服务器,从服务器上可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器上相应数据。
    • 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能。
  • 主从同步的机制在这里插入图片描述
    Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。

    在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。

    每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。
    主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)

  • 主从配置步骤可以参考 /python高级-全部(html版)/19day/主从.html

猜你喜欢

转载自blog.csdn.net/weixin_42310008/article/details/113132642