1.视图
数据库表结构发生变化,查询数据的sql语句最好不发生变化问题
对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦
解决办法:定义视图
视图是什么
通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);
方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;
定义视图
建议以v_开头
create view 视图名称 as select语句;
查看视图
查看表会将所有的视图也列出来
show tables;
使用视图
视图的用途就是查询
select * from v_stu_score;
删除视图
drop view 视图名称;
drop view v_stu_sco;
视图demo
视图的作用
提高了重用性,就像一个函数
对数据库重构,却不影响程序的运行
提高了安全性能,可以对不同的用户
让数据更加清晰
2.事务
所谓事物,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
事物四大特性(ACID)
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
案例
创建表
create table money(id int unsigned not null primary key auto_increment,num int unsigned not null);
insert into money(0,100),(0,200),(0,0);
begin;
update money set num=num-100 where id =1;
select * from money;
3.索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
3.1 创建测试表testindex
create table test_index(title varchar(10));
3.2 使用python程序(ipython也可以)通过pymsql模块 向表中加入十万条数据
from pymysql import connect def main(): # 创建Connection连接 conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='12345678',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()
3.3 查询
开启运行时间监测:
set profiling=1;
查找第1万条数据ha-99999
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;
4.账户管理
在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行操作,主要的操作就是数据的crud
MySQL账户体系:根据账户所具有的权限的不同,MySQL的账户可以分为以下几种
服务实例级账号:,启动了一个mysqld,即为一个数据库实例;如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库、连同这些库中的表
数据库级别账号:对特定数据库执行增删改查的所有操作
数据表级别账号:对特定表执行增删改查等所有操作
字段级别的权限:对某些表的特定字段进行操作
存储程序级别的账号:对存储程序进行增删改查的操作
账户的操作主要包括创建账户、删除账户、修改密码、授权权限等
注意:
进行账户操作时,需要使用root账户登录,这个账户拥有最高的实例级权限
通常都使用数据库级操作权限
4.1 授予权限
授予权限
需要使用实例级账户登录后操作,以root为例
主要操作包括:
查看所有用户
修改密码
删除用户
查看所有用户
所有用户及权限信息存储在mysql数据库的user表中
查看user表的结构
desc user;
主要字段说明:
Host表示允许访问的主机
User表示用户名
authentication_string表示密码,为加密后的值
查看所有用户
select host,user,authentication_string from user;
结果
mysql> select host,user,authentication_string from user;
±----------±-----------------±------------------------------------------+
| host | user | authentication_string |
±----------±-----------------±------------------------------------------+
| localhost | root | * E74858DB86EBA20BC33D0AECAE8A8108C56B17FA |
| localhost | mysql.sys | * THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | debian-sys-maint | * EFED9C764966EDB33BB7318E1CBD122C0DFE4827 |
±----------±-----------------±------------------------------------------+
3 rows in set (0.00 sec)
2. 创建账户、授权
需要使用实例级账户登录后操作,以root为例
常用权限主要包括:create、alter、drop、insert、update、delete、select
如果分配所有权限,可以使用all privileges
2.1 创建账户&授权
grant 权限列表 on 数据库 to ‘用户名’@‘访问主机’ identified by ‘密码’;
2.2 示例1
创建一个laowang的账号,密码为123456,只能通过本地访问, 并且只能对jing_dong数据库中的所有表进行读操作
step1:使用root登录
mysql -uroot -p
回车后写密码,然后回车
step2:创建账户并授予所有权限
grant select on jing_dong.* to ‘laowang’@‘localhost’ identified by ‘123456’;
说明可以操作python数据库的所有表,方式为:jing_dong.*
访问主机通常使用 百分号% 表示此账户可以使用任何ip的主机登录访问此数据库
访问主机可以设置成 localhost或具体的ip,表示只允许本机或特定主机访问
查看用户有哪些权限
show grants for laowang@localhost;
step3:退出root的登录
quit
step4:使用laowang账户登录
mysql -ulaowang -p
回车后写密码,然后回车
5.主从
主从同步的定义
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
使用主从同步的好处:
通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
2. 主从同步的机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y4MrUvJw-1571040004536)(evernotecid://6A164892-EBA1-4DDC-869E-9660D4D960A1/appyinxiangcom/18066868/ENResource/p415)]
Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。
在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。
每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。
主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)
配置主从同步的基本步骤
有很多种配置主从同步的方法,可以总结为如下的步骤:
在主服务器上,必须开启二进制日志机制和配置一个独立的ID
在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
在开始复制进程前,在主服务器上记录二进制文件的位置信息
如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
4. 详细配置主从同步的方法
主和从的身份可以自己指定,我们将虚拟机Ubuntu中MySQL作为主服务器,将Windows中的MySQL作为从服务器。 在主从设置前,要保证Ubuntu与Windows间的网络连通。
4.1 备份主服务器原有数据到从服务器
如果在设置主从同步前,主服务器上已有大量数据,可以使用mysqldump进行数据备份并还原到从服务器以实现数据的复制。
4.1.1 在主服务器Ubuntu上进行备份,执行命令:
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
说明
-u :用户名
-p :示密码
–all-databases :导出所有数据库
–lock-all-tables :执行操作时锁住所有表,防止操作时有数据修改
~/master_db.sql :导出的备份数据(sql文件)位置,可自己指定
4.1.2 在从服务器Windows上进行数据还原
找到Windows上mysql命令的位置
新打开的命令窗口,在这个窗口中可以执行类似在Ubuntu终端中执行的mysql命令
将从主服务器Ubuntu中导出的文件复制到从服务器Windows中,可以将其放在上面mysql命令所在的文件夹中,方便还原使用
在刚打开的命令黑窗口中执行还原操作:
mysql –uroot –pmysql < master_db.sql
4.2 配置主服务器master(Ubuntu中的MySQL)
4.2.1 编辑设置mysqld的配置文件,设置log_bin和server-id
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
4.2.2 重启mysql服务
sudo service mysql restart
4.2.3 登入主服务器Ubuntu中的mysql,创建用于从服务器同步数据使用的帐号
mysql –uroot –pmysql
GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’ identified by ‘slave’;
FLUSH PRIVILEGES;
4.2.4 获取主服务器的二进制日志信息
SHOW MASTER STATUS;
File为使用的日志文件名字,Position为使用的文件位置,这两个参数须记下,配置从服务器时会用到
4.3 配置从服务器slave(Windows中的MySQL)
4.3.1 找到Windows中MySQL的配置文件
4.3.2 编辑my.ini文件,将server-id修改为2,并保存退出。
4.3.3 打开windows服务管理
可以在开始菜单中输入services.msc找到并运行
4.3.4 在打开的服务管理中找到MySQL57,并重启该服务
进入windows的mysql,设置连接到master主服务器
change master to master_host=‘10.211.55.5’, master_user=‘slave’, master_password=‘slave’,master_log_file=‘mysql-bin.000006’, master_log_pos=590;
注:
master_host:主服务器Ubuntu的ip地址
master_log_file: 前面查询到的主服务器日志文件名
master_log_pos: 前面查询到的主服务器日志文件位置
开启同步,查看同步状态
测试主从同步
在Ubuntu的MySQL中(主服务器)创建一个数据库 在Windows的MySQL中(从服务器)查看新建的数据库是否存在