python修炼——MySQL 高级!

本文内容概述:MySQL 的视图、事务、索引、账户管理、MySQL 主从同步配置。
其中账户管理和MySQL 主从同步配置了解即可。视图、事务、索引需要记住,面试会问。

视图

-- 视图就是一条 SELECT 语句执行后返回的结果集
-- 视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变

-- 作用
-- 方便操作,特别是查询操作,减少复杂的 SQL 语句,增强可读性;
-- 提高了重用性,就像一个函数
-- 对数据库的重构,却不影响程序的运行
-- 提高了安全性,可以针对不同的用户
-- 让时间更加清晰


-- 定义视图
-- 建议以 V_ 开头
-- create view 视图名称 as select语句
create view v_goods_info as select g.*,c.name as cates_name,b.name as brands_name from gofrom goods as g left join goods_cates as c on g.cate_id=c.id left join goods_brandon g.brand_id=b.id;

-- 查看视图
show tables;
select * from v_goods_info;

-- 删除视图
--drop view 视图名称;
drop view v_goods_info;

事务(ACID)

增删改需要使用

  • 原子性(Atomicity) :一个整体,要么全部成功,要么全部失败

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性

  • 一致性(Consistency) :不会因为执行到一半系统崩溃而影响

数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)

  • 隔离性(Isolation) :上一个事务没有执行完,下一个会等待

通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)

  • 持久性(Durability) :数据库是一个特殊的文件,文件会一直保存

一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)

事务命令
  • 开启事务
--开启事务后执行修改命令,变更会维护到本地缓存中,而不会维护到物理表中
begin;   
或者   
start transaction;
  • 提交事务
--将缓存中的数据变更维护到物理表中
commit;
  • 回滚事务
--放弃缓存中变更的数据
rollback;

注意

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

索引

  • 当数据库中数据量很大时,查找数据会变的很慢,可以使用索引来优化
  • 索引是什么?

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

  • 查看索引
show index from 表名;
  • 创建索引
--如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致;
-- 字段类型如果不是字符串,可以不填写长度部分。

create index 索引名称 on 表名(字段名称(长度));
  • 删除索引
drop index 索引名称 on 表名;
索引 demo
  • 创建测试表 testindex
create table test_index(title varchar(10));
  • 插入数据
# 使用 python 程序通过 pymysql 模块向表中加入十万条数据

from pymysql import connect

def main():
    # 创建 connection 连接
    conn = connect(host="localhost", port=3306, user="root", password="mysql", database="jing_dong", charset="utf8")
    # 获得 cursor 对象
    cursor = conn.cursor()
    # 插入10万数据
    for i in range(100000):
        cursor.execute("insert into test_index value("ha-%d"")" % i)
    # 提交数据
    conn.commit()

if __name__ == "__main__":
    main()
查询
  • 开启运行时间监测
set profiling=1;
  • 查找第10万条数据
select * from test_index where title="ha-99999";
  • 查看执行的时间
show profiles;
  • 为表 title_index 的title列创建索引
create index title_index on test_index(title(10));
  • 执行查询语句
select * from test_index where title="ha-99999";
  • 再次查看执行的时间
--此时查询的时间就会少很多
show profiles;
注意

要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的 where 字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

建立索引会占用磁盘空间。

账户管理

  • 在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行操作,主要的操作就是数据的crud
  • MySQL账户体系:根据账户所具有的权限的不同,MySQL的账户可以分为以下几种
    • 服务实例级账号:,启动了一个mysqld,即为一个数据库实例;如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库、连同这些库中的表
    • 数据库级别账号:对特定数据库执行增删改查的所有操作
    • 数据表级别账号:对特定表执行增删改查等所有操作
    • 字段级别的权限:对某些表的特定字段进行操作
    • 存储程序级别的账号:对存储程序进行增删改查的操作
  • 账户的操作主要包括创建账户、删除账户、修改密码、授权权限等

注意:

  1. 进行账户操作时,需要使用root账户登录,这个账户拥有最高的实例级权限

  2. 通常都使用数据库级操作权限

授予权限
  • 查看所有用户
--所有用户及权限信息存储在mysql数据库的user表中
--查看user表的结构
desc user;

--主要字段说明:
--Host表示允许访问的主机
--User表示用户名
--authentication_string表示密码,为加密后的值
select host,user,authentication_sting from user;
  • 创建账户、授权
--需要使用实例级账户登录后操作,以root为例
--常用权限主要包括:create、alter、drop、insert、update、delete、select
--如果分配所有权限,可以使用all privileges

grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
  • 修改权限
grant 权限名称 on 数据库 to 账户@主机 with grant option;
  • 修改密码
--使用root登录,修改mysql数据库的user表

--使用password()函数进行密码加密
update user set authentication_string=password('新密码') where user='用户名';

--注意修改完成后需要刷新权限
flush privileges
  • 远程登录(慎用)
-- 了解即可
--修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
--将该文件中的  bind-addr = 127.0.0.1  使用 # 注释掉接口

--然后重启即可
service mysql restart
  • 删除账户
-- 1. 使用 root 登录    推荐使用
drop user '用户名'@'主机'

-- 2. 使用root登录,删除mysql数据库的user表中数据
delete from user where user='用户名';
--操作结束之后需要刷新权限
flush privileges;

MySQL 主从同步配置

目前不会使用到,了解即可

之后如果需要使用,再找教程

猜你喜欢

转载自blog.csdn.net/qyf__123/article/details/82289865