数据:文本、图片、视频、音频、网页……….
数据库:按照一定的数据格式、结构存储数据的仓库
内存:
优点:存取速度快
缺点:
1、 容量小
2、 断电后,数据不会保存
文件:
优点:数据可以持久化保存
缺点:
1、 读取速度慢
2、 编码格式不好控制
数据库:
1、 容量大
2、 读取速度快
3、 统一的编码格式
数据库管理软件 Database Manage system
概念:简称DBMS,是一种操作数据库的软件
使用人员:
1、 程序员
2、 DBA Database Administrator 数据库管理员
应用的本质是什么?
对于开发人员:尽可能的用一种友好的方式,将数据传输给用户。
对于用户而言:获取我们想要的数据。
1、 MySQL
2、 Oracle
3、 MS SQL Server
4、 Sqlite
概念:MsSQL是一个关系型数据库管理系统。
优点:开源、免费、不要钱、跨平台性支持好、提供了多种语言调用的API
Aplication interface 应用程序接口。 函数
使用范围广。
关系模型概念:以行和列的形式进行数据的存储
便于用户理解
关系模型 |
数据表 |
关系 |
表 |
属性 |
字段(列) |
域 |
字段(列)的取值范围 |
元祖 |
一行记录(一条记录) |
结论:
多行+多列=表
多表=数据库
画图演示
sudo apt-get install mysql-server
sudo apt isntall mysql-client
sudo apt install libmysqlclient-dev
1、 查看服务是否开启,命令:ps aux|grep mysql
2、 mysql服务相关命令
a) 启动:sudo service mysql start
b) 停止:sudo service mysql stop
c) 重启:sudo service mysql restart
a) 登录navicat官网下载
b) 将压缩包拷贝ubuntu中进行解压,解压命令:tar zxvf navicat.tar.gz
c) 进入解压目录,运行命令./start
d) 删除./navicat……
1、通过客户端软件登录
2、通过命令登录
登录远程主机:mysql [-h 192.168.205.129 –p 3306] –uroot –pmysql(注意:远程登录需要配置)
3、退出客户端:exit quit ctrl+d
4、登录本机:mysql –uroot -pmysql
1、 防火墙
2、 sudo apt-get install ufw
3、 sudo ufw enable ubuntu firewall
4、 sudo ufw status
5、 sudo ufw disable
6、 软件
a) 更改配置文件 bind-address
7、 权限
a) update `user` set host=”%” where user=”root”
4、重启服务
允许指定用户访问:
GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘10.10.11.12‘ IDENTIFIED BY ‘FEFJay‘ WITH GRANT OPTION; flush privileges;
而IP这里,可以使用%来表示所有IP
第一行中,10.10.11.12是一个ip地址,这个是允许远程访问的IP的值。自行改为其他值。
root是账户名,后面的FEFJay是密码。
即,允许来自10.10.11.12的连接并使用root账户和FEFJay这个密码进行访问。
ALL PRIVILEGES ON 后面的*.*表示所有数据库,即完全访问权限,可以指定为特定数据库。
而IP这里,可以使用%来表示所有IP。
information_schema:元数据
mysql:当前数据库信息
performance_schema:数据库优化
sys:information_schema+performance_schema
SQL:操作数据的语言。结构化查询语言
Summer SUMMER summer
create database 数据库名
create database 数据库名 character set utf8
show create database 数据库名
alter database 数据库名 character set utf8
drop database 数据库名
use 数据库名
select database()
show databases
create table 表名
(
字段1 字段类型,
字段2 字段类型,
字段3 字段类型……
)
Float |
Double |
Decimal |
Float |
Double |
Decimal |
Float(m,n) |
Double(m,n) |
Decimal(m,n) |
7个有效位 |
15个有效位 |
28个有效位 |
Float(5,2)999.99 |
Decimal(5,2) 999.99 |
|
m表示该值得总长度,D表示小数点后的位数
char、varchar、text、blob 超大型的文本,也不会存储到数据库中 图片 文件
char 固定长度 char(10) 张三
varchar 可变长度 varchar(10) 张三 varchar(2)
地址
图片:
/home/python/abc.jpg
图片的二进制
char 固定长度 char(10) 张三
varchar 可变长度 varchar(10) 张三 张三 varchar(2)
char(8) varchar(8)
show full fields from table
4、enum 枚举
enum(‘男’,’女’)
date:yy:mm:dd
datetime:yy-mm-dd hh:mm:ss
time:hh:mm:ss
练习一:
SID |
SNAME |
SAGE |
SGENDER |
SBIR |
SADD |
1 |
张三 |
18 |
男 |
1990-01-01 |
中国北京 |
2 |
李四 |
19 |
女 |
1990-01-01 |
中国北京 |
练习二:
创建数据库 School
TblStudent学生表
--tSId --学生编号
-- tSName --姓名
-- tSGender--性别
-- tSAddress --地址
-- tSPhone --电话
-- tSAge --年龄
-- tSBirthday --生日
-- tSCardId --身份证号
-- tSClassId --班级Id
TblScore成绩表:
-- tScoreId(成绩id,主键,自动编号)
-- tSId(学生编号)
-- tEnglish(英语成绩)
-- tMath(数学成绩)
TblClass班级表:
-- cId –班级ID
-- cName –班级名称
-- cDesciption –班级描述
TblTeacher老师表:
-- tTId
-- tTName
-- tTGender
-- tTAge
-- tTSalary
pyt-- tTBirthday
***数据导出
mysqldump –uroot –p(注意不要输入密码) 要导出的数据库名 到导出的数据库表 > 目标文件.sql
mysqldump –uroot –p school > /home/python/Desktop/目标文件.sql
***数据导入
1、在数据库中创建一个空数据库
2、执行命令:mysql -uroot -p 新数据库的名称 < 要导入的数据库名.sql
***对数据表进行增删改查操作
作用:查询数据表中数据
查询数据表中全部的行和列
查询表的部分列
给查询出来的数据列设置别名
DISTINCT关键字的使用
语法:
1、 select col1,col2,col3….from table
2、 select * from table
select col1,col2,col3…from table
select col1 as “别名1”,col2 as ‘别名2’…from table
select col1 ‘别名1’,col2 ‘别名2’….from table
注意多表查询重名问题
作用:消除结果集中的重复数据
语法:select distinct col from table
注意:要求所有的字段都相同才会去重
作用:指定结果的显示范围
语法:
1、 select * from table limit m,n
m:起始的位置
n:显示的数量
2、 select * from table limit m
m:从第一条开始共显示m条数据
所有列都插入值
为特定列插入值
一次性插入多条记录
语法:insert into table values(v1,v2,v3….)
特点:列值同数,列值同序
语法:insert into table(col1,col2,col3) values(v1,v2,v3)
特点:指定顺序,列值对应
语法:insert into table(co1,col2,col3…)values
(v1,v2,v3),
(v1,v2,v3),
(v1,v3,v3)…..
修改指定数据
修改全部数据
语法:update table set {col1=value1}[…n]where expressioin
语法:update table set {col1=value1}[…n]
使用delete命令删除数据
使用truncate命令删除数据
使用逻辑删除
语法:delete from table where expression
truncate table
1、Delete语句删除数据,自动编号没有恢复到默认值。但是truncate重新设置了自动编号
2、通过truncate语句删除数据表数据,不能根据条件删除,而是一次性删除,delete语句可以根据条件进行删除
3、truncate在清空表中数据的时候,速度要比delete语句快的多
alter table tablename add 列名 数据类型
alter table tablename drop 、 列名
alter table tablename modify 列名 数据类型
alter table tablename change old_colname new_colname 数据类型
约束概念:限定数据库中数据的一套规则
约束作用:保证数据的准确性、完整性、可靠性、联动性。
数据库常用约束:
作用:让数据具有唯一标识
语法:
create table table_primarykey
(
id int primary key
)
特点:自动设置非空约束
作用:使数据自动增长,一般给主键设置
语法:
create table table_autoincrement
(
id int primary key auto_increment
)
作用:保证数据的准确性
语法:
create table table_unique
(
qqnumber int unique
)
特点:可以为多列设置唯一约束
作用:保证数据不为空
语法:
create table table_notnull
(
name varchar(30) not null
)
作用:给字段设置默认值
语法:
create table table_default
(
sex char(2) default ‘男’
)
作用:检查数据的完整性
语法:
create table table_check
(
sex char(2) check(‘男’ or ‘女’)
)
create table table_enum
(
sex enum(‘男’,’女’)
)
作用:让两表之间产生联动关系
语法:
create table class
(
id int primary key auto_increment,
classname varchar(30) not null
)
create table score
(
id int primary key auto_increment,
chinese_score int not null,
foreign key(id) references class(id)
)
要想删除class表和score表,首先要删除score表
语法:alter table table_name add constrain con_name primary key(col_name)
1、添加外键约束
语法:alter table table_name add constrain con_name foreign key(col_name) references table(col_name)
2、删除外键约束
1、添加检查约束
语法:alter table table_name add constraint con_name check(expression)
2、删除检查约束
语法:alter table table_name alter col_name default value
语法:alter table table_name modify column col_name type auto_increment
新建一张表:员工信息表
createtable Employees
(
EmpId int,
EmpName varchar(50),
EmpGender char(2),
EmpAge int,
EmpEmail varchar(100),
EmpAddress varchar(500)
)
createtable Department
(
DepId int ,
DepName varchar(50)
)
--手动删除一列(删除EmpAddress列)
--手动增加一列(增加一列EmpAddr varchar(1000))
--手动修改一下EmpEmail的数据类型(varchar(200))
--手动修改一下EmpEmail的数据类型及名称
--为EmpId增加一个主键约束
--非空约束,为EmpName增加一个非空约束
--为EmpName增加一个唯一约束
--为年龄增加一个默认约束,默认为0
--为年龄增加一个检查约束:年龄必须在-120岁之间,含0岁与120岁。
--创建一个部门表,然后为Employee表增加一个DepId列。
约束 查询 添加 删除 添加列 删除列
主键约束 alter table tableName add constraint PK_name primary key(列名)
外键约束 alter table tablename add constraint FK_外键的列名_主键的列名 foreign key (外键列名) references 主键表名(主键名)
默认约束
alter table tableName modify 列名 类型 default 默认值
唯一约束
alter table tableName add constraint UQ_列名 unique 列名
非空约束
alter table tableName modify 列名 类型 not null
检查约束
altert table tableName add constraint CK_列名 check(表达式)
自动增长
alter table tableName modify 列名 类型 auto_increment
--增加外键约束
createtable Employees
(
EmpId int,
EmpName varchar(50),
EmpGender char(2),
EmpAge int,
EmpEmail varchar(100),
EmpAddress varchar(500)
Deptid int
)
createtable Department
(
DepId int ,
DepName varchar(50)
)
primary key add constraint
foreign key add constraint
check
unique
modify
not null
default
注意:Department DepId主键问题
--删除主键约束
1、先删除主键的自动增长
2、删除主键约束
alter table Employees drop primary key
--删除外键约束
alter table Employees drop foreign key FK_DepId
--删除唯一约束
alter table Employees drop index UQ_EmpName
需求分析:根据用户的需求,分析出需要记录的数据
需求设计:根据分析出的数据,设计E-R模型图
详细设计:将E-R模型图转换成数据表
三大范式:使用数据库三大范式的设计思想对数据表进行审核
概念:Entity-Relationship,实体关系图
组成元素:
举例,将下面三张表用E-R模型图表示出来
概念:三大范式是数据库的一种设计规范,主要用来检查我们的数据库是否存在冗余数据。
第三范式:要求表中不存在冗余字段
create table Score
(
sId int primary key auto_increment,
studentId int not null,
english float,
math float
)
create table teacher
(
tId int auto_increment primary key,
tName varchar(50) not null,
tSex char(2),
tAge int,
tSalary decimal
)
create table Class
(
cId int auto_increment primary key,
cName nvarchar(50) not null,
cDesciption text
)
createtable Student
(
SId intauto_incrementprimarykey,
SName varchar(50),
SGender char(2)notnull,
SAddress varchar(300),
SPhone varchar(100),
SAge int,
SBirthday datetime,
SCardId varchar(18)null,
SClassId intnotnull
)
普通条件查询
模糊查询
查询空值的运算符
语法:select * from table where expression
select * from table where id != 1
where:将查询到的数据,通过where后的expression一条一条的进行筛选,符合要求则显示,不符合要求则去除。
语法:
1、between….and….
2、范围查询 in 、or
3、like 通配符 %和_ % 随便 _一个
is null is not null
多列排序:
关注点:升序、降序、优先级
语法:select col1..col2.. from table Group by col
分组配合排序
注意:如果使用了group by分组,那么select不允许出现其他列,除非这些列包含在分组中。
注意:在使用聚合函数后,select后不允许出现其他列,除非这些列包含在分组中或者聚合函数中
练习:判断下列sql语句是否正确
select c_class_id,count(*),c_age from t_student group by c_class_id
select c_class_id,count(*),count(c_age) from t_student group by c_class_id
作用:having 为group by之后得到数据进行进一步的筛选
类似于select 和 where的关系。Where为select后的数据进行进一步的筛选。
Having 为group by后的数据进行筛选
Select c_gender, avg(c_age) as ‘平均年龄‘ from t_student group by c_gender having 平均年龄 > 40;
综合练习:
order_info表
1、 热销售商品排名表【即按照每种商品的总销售数量排序】
select 商品名称,sum(销售数量) as ‘总销售数量’ from order_info group by 商品名称 order by 总销售数量 desc
2、 请统计销售总结超过400元的商品名称和销售总价,并按照销售总价降序排列
select 商品名称,sum(销售数量*销售价格) as ‘销售总价’from order_info group by 商品名称 having 销售总价>400 order by 销售总价 desc
3、 统计每个销售员对“乐百氏果冻”的销售量
1、 根据销售员进行分组
2、 筛选 乐百氏果冻
select 销售员,sum(销售数量) from order_info group by 销售员
语法:
select * from table limit m
select * from table limit m,n
1—from 表名
2—where
3—group by
4—select distinct *
5—having
6—order by
7—limit
Select c_gender, avg(c_age) as ‘平均年龄‘ from t_student where c_age > 10 group by c_gender having 平均年龄 > 40 order by 平均年龄 asc limit 2
当查询结果的数据来自多张表的时候,需要将多张表连接成一个大的数据集,再选择合适的列进行返回。
内连接:选择两种表中交叉的数据进行返回
左连接:选择左表全部数据以及右边中和左表相同的数据
右连接:选择右表全部数据以及左表中和右表相同的数据
笛卡尔积:两张表数据行的乘积
让某张表自己和自己进行连接。
设计省信息的表结构
create table province
(
id int,
ptitle varchar(30)
)
create table
city
(
id int,
ptitle varchar(30),
pid int 存储当前城市所属省的id
)
create table
xiancheng
(
id int,
ptitle varchar(30),
pid int
)
如果还有县城的信息表、乡镇的信息表、村子的信息表,怎么做?
把他们放到一张表中。
Create table areas
(
id int,
atitle varchar(100),
pid int
)
解释:
1、 省份不需要填写pid,设置为null即可
2、 城市的pid,填写所属省份的id
3、 这就是自关联,表中的某一列关联了表中的另外一列,但是他们的业务含义是不一样的。
4、在这个表中,不需要改变结构,可以添加线程、乡镇、村子的信息表,只需要在pid填写所属的上级行政区的id即可。
source /home/python/Desktop/areas.sql
将一个查询结果在另一个查询中使用,称之为子查询。
select * from (select col1,col2,col3 from table) as t
独立子查询:
子查询可以独立运行
相关子查询:
子查询中引用了父查询的结果或者父查询中引用了子查询的结果,
子查询和父查询都不可以独立运行
1、如果主查询使用到子查询的数据,则必须给子查询起一个表名。
2、在子查询使用关系运算符的时候要注意,因为子查询有可能返回多个值。
-- 创建 "京东" 数据库
create database jing_dong charset=utf8;
-- 使用 "京东" 数据库
use jing_dong;
-- 创建一个商品goods数据表
create table goods(
id int unsigned primary key auto_increment not null,
name varchar(150) not null,
cate_name varchar(40) not null,
brand_name varchar(40) not null,
price decimal(10,3) not null default 0,
is_show bit not null default 1,
is_saleoff bit not null default 0
);
-- 向goods表中插入数据
insert into goods values(0,‘r510vc 15.6英寸笔记本‘,‘笔记本‘,‘华硕‘,‘3399‘,default,default);
insert into goods values(0,‘y400n 14.0英寸笔记本电脑‘,‘笔记本‘,‘联想‘,‘4999‘,default,default);
insert into goods values(0,‘g150th 15.6英寸游戏本‘,‘游戏本‘,‘雷神‘,‘8499‘,default,default);
insert into goods values(0,‘x550cc 15.6英寸笔记本‘,‘笔记本‘,‘华硕‘,‘2799‘,default,default);
insert into goods values(0,‘x240 超极本‘,‘超级本‘,‘联想‘,‘4880‘,default,default);
insert into goods values(0,‘u330p 13.3英寸超极本‘,‘超级本‘,‘联想‘,‘4299‘,default,default);
insert into goods values(0,‘svp13226scb 触控超极本‘,‘超级本‘,‘索尼‘,‘7999‘,default,default);
insert into goods values(0,‘ipad mini 7.9英寸平板电脑‘,‘平板电脑‘,‘苹果‘,‘1998‘,default,default);
insert into goods values(0,‘ipad air 9.7英寸平板电脑‘,‘平板电脑‘,‘苹果‘,‘3388‘,default,default);
insert into goods values(0,‘ipad mini 配备 retina 显示屏‘,‘平板电脑‘,‘苹果‘,‘2788‘,default,default);
insert into goods values(0,‘ideacentre c340 20英寸一体电脑 ‘,‘台式机‘,‘联想‘,‘3499‘,default,default);
insert into goods values(0,‘vostro 3800-r1206 台式电脑‘,‘台式机‘,‘戴尔‘,‘2899‘,default,default);
insert into goods values(0,‘imac me086ch/a 21.5英寸一体电脑‘,‘台式机‘,‘苹果‘,‘9188‘,default,default);
insert into goods values(0,‘at7-7414lp 台式电脑 linux )‘,‘台式机‘,‘宏碁‘,‘3699‘,default,default);
insert into goods values(0,‘z220sff f4f06pa工作站‘,‘服务器/工作站‘,‘惠普‘,‘4288‘,default,default);
insert into goods values(0,‘poweredge ii服务器‘,‘服务器/工作站‘,‘戴尔‘,‘5388‘,default,default);
insert into goods values(0,‘mac pro专业级台式电脑‘,‘服务器/工作站‘,‘苹果‘,‘28888‘,default,default);
insert into goods values(0,‘hmz-t3w 头戴显示设备‘,‘笔记本配件‘,‘索尼‘,‘6999‘,default,default);
insert into goods values(0,‘商务双肩背包‘,‘笔记本配件‘,‘索尼‘,‘99‘,default,default);
insert into goods values(0,‘x3250 m4机架式服务器‘,‘服务器/工作站‘,‘ibm‘,‘6888‘,default,default);
insert into goods values(0,‘商务双肩背包‘,‘笔记本配件‘,‘索尼‘,‘99‘,default,default);
SQL习题:
思路:
1、 每种分类最贵的
2、 连接所有信息表
3、 选择数据
问题:如果删除了某一个商品类型的所有商品会出现什么问题?
-- 创建商品分类表
create table if not exists goods_cates(
id int unsigned primary key auto_increment,
name varchar(40) not null
);
insert into goods_cates(name) select cate_name from goods group by cate_name
update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;
-- select brand_name from goods group by brand_name;
-- 在创建数据表的时候一起插入数据
-- 注意: 需要对brand_name 用as起别名,否则name字段就没有值
create table goods_brands (
id int unsigned primary key auto_increment,
name varchar(40) not null)
查询goods_brands表中的brand_name
将分组结果写入到goods_brand数据表
通过goods_brands数据表来更新goods数据表
update goods name=b.id;
查看 goods 的数据表结构,会发现 cate_name 和 brand_name对应的类型为 varchar
但是存储的都是数字
desc goods;
通过alter table语句修改表结构
alter table goods
change cate_name cate_id int unsigned not null,
change brand_name brand_id int unsigned not null;
分别在 goods_cates 和 goods_brands表中插入记录
insert into goods_cates(name) values (‘路由器‘),(‘交换机‘),(‘网卡‘);
insert into goods_brands(name) values (‘海尔‘),(‘清华同方‘),(‘神舟‘);
在 goods 数据表中写入任意记录
insert into goods (name,cate_id,brand_id,price)
values(‘LaserJet Pro P1606dn 黑白激光打印机‘, 12, 4,‘1849‘);
查询所有商品的详细信息 (通过内连接)
select g.id,g.name,c.name,b.name,g.price from goods as g
inner join goods_cates as c on g.cate_id=c.id
inner join goods_brands as b on g.brand_id=b.id;
查询所有商品的详细信息 (通过左连接)
select g.id,g.name,c.name,b.name,g.price from goods as g
left join goods_cates as c on g.cate_id=c.id
left join goods_brands as b on g.brand_id=b.id;
如何防止无效信息的插入,就是可以在插入前判断类型或者品牌名称是否存在呢? 可以使用之前讲过的外键来解决
外键约束:对数据的有效性进行验证
关键字: foreign key,只有 innodb数据库引擎 支持外键约束
对于已经存在的数据表 如何更新外键约束
·
-- 给brand_id 添加外键约束成功
·
alter table goods add foreign key (brand_id) references goods_brands(id);
·
-- 给cate_id 添加外键失败
·
-- 会出现1452错误
·
-- 错误原因:已经添加了一个不存在的cate_id值12,因此需要先删除
· alter table goods add foreign key (cate_id) references goods_cates(id);
如何在创建数据表的时候就设置外键约束呢?
注意: goods 中的 cate_id 的类型一定要和 goods_cates 表中的 id 类型一致。
create table goods(
id int primary key auto_increment not null,
name varchar(40) default ‘‘,
price decimal(5,2),
cate_id int unsigned,
brand_id int unsigned,
is_show bit default 1,
is_saleoff bit default 0,
foreign key(cate_id) references goods_cates(id),
foreign key(brand_id) references goods_brands(id)
);
·
-- 需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称
·
show create table goods;
·
-- 获取名称之后就可以根据名称来删除外键约束
· alter table goods drop foreign key 外键名称;
命令:pip3 install pymysql
from pymysql import *
conn=connect(参数列表)
对象的方法
cs1=conn.cursor()
对象的属性
制作京东案例:
提供用户 1、查询所有商品信息 2查询所有分类信息
3、查询所有品牌信息
备份
mysqldump –uroot –p 数据库名 > python.sql
恢复
连接mysql数据库,创建新的数据库
退出连接,执行如下命令
source:
mysql –uroot –p新数据库名 <python.sql
create table user_info
(
id int unsigned primary key auto_increment not null,
name varchar(40) not null,
password varchar(40) not null
)
insert into user_info values(0,’张三’,’123abc’),(0,’李四’,’abc123’)
如果用户输入’#,则会造成sql注入
解决方案:将参数以列表的方式传入execute方法。
如果我有一个很复杂的sql语句,但是我还会经常使用该怎么办?
查询goods和goods_cates和brands_cates的信息。
1、 视图是一个虚拟表。
2、 视图同样跟真实表一样包含行和列,但是视图没有在数据库中真实的存储数据
3、 视图中行和列的数据都来自于其引用的真实表中行和列的数据
create view 视图名称 as select 语句。
查询goods和goods_cates和brands_cates的信息。
注意列同名问题。
create view v_detail as select a.id,a.name,a.cate_id,a.brand_id,a.price,b.name as ‘b_name‘ ,c.name as ‘c_name‘ from goods as a inner join goods_cates as b inner join goods_brands as c on a.cate_id =b.id and a.brand_id = c.id;
查看所有的表,同时也会将所有的视图显示出来
show tables
select * from 视图名称
drop view 视图名称
1、 安全性
2、 方便操作,减少编写复杂的重复的sql语句
3、 易于扩展
例:a表、b表删除,使用c表
查询goods和goods_cates和goods_brands三张表中的信息
create view v_goods_details as select a.name as ‘aname‘,a.price ,b.name as ‘bname‘,c.name as ‘cname‘ from goods as a inner join goods_cates as b on a.cate_id=b.id inner join good
如,转账问题:
将A账户中的10000元,转入到B账户中,需要三步:
如果执行完第二步程序出问题了呢?
所谓事物,他就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
一个事务被看作为一个最小的工作单位,整个事务中的所有操作,要么都提交成功,要么都提交失败,不可能只执行事务中的某一个部分。
数据库总是从一个一致性的状态转移到另一个一致性的状态。事务中如果有操作没有提交成功,其他操作也不可能提交成功。
一个事务在提交前,对其他事务是不可见的.
一旦事务提交,则其所作的所有修改会永久性保存到数据库中。
开启事务后,修改的数据会存储到本地缓存中,而不会修改物理表
begin
或者
start transaction
将缓存中的数据变更到物理表中
commit
放弃缓存中的变更数据
rollback
1、使用insert、update、delete会自动触发事务。
可以通过set autocommit = 0进行命令行设置
2、表的insert、update、delete可以rollback
表的create/drop 不可以rollback
在图书馆中是如何找到一本书的?
一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询操作时有1次写的操作),
而且插入操作和更新操作很少出现性能问题,
遇到最多、最容易出问题还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。
当数据库中数据量很大时,查找数据会变得很慢
优化方案:索引
索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。
更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
索引的目的在于提高查询效率
除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果.
show index from 表名;
create index 索引名称 on 表名(字段名称(长度))
drop index 索引名称 on 表名;
create table test_index(title varchar(10));
frompymysql
importconnect
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
inrange(
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字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
建立索引会占用磁盘空间
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
使用主从同步的好处:
Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。
在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。
每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。
主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)
有很多种配置主从同步的方法,可以总结为如下的步骤:
主和从的身份可以自己指定,我们将虚拟机Ubuntu中MySQL作为主服务器,将Windows中的MySQL作为从服务器。 在主从设置前,要保证Ubuntu与Windows间的网络连通。
如果在设置主从同步前,主服务器上已有大量数据,可以使用mysqldump进行数据备份并还原到从服务器以实现数据的复制。
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
说明
找到Windows上mysql命令的位置
新打开的命令窗口,在这个窗口中可以执行类似在Ubuntu终端中执行的mysql命令
将从主服务器Ubuntu中导出的文件复制到从服务器Windows中,可以将其放在上面mysql命令所在的文件夹中,方便还原使用
在刚打开的命令黑窗口中执行还原操作:
mysql –uroot –pmysql < master_db.sql
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
sudo service mysql restart
mysql –uroot –pmysql
GRANT REPLICATION SLAVE ON *.* TO ‘slave‘@‘%‘ identified by ‘slave‘;
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
File为使用的日志文件名字,Position为使用的文件位置,这两个参数须记下,配置从服务器时会用到
可以在开始菜单中输入services.msc找到并运行
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;
注:
在Ubuntu的MySQL中(主服务器)创建一个数据库
在Windows的MySQL中(从服务器)查看新建的数据库是否存在
原文:https://www.cnblogs.com/jinyanjun/p/9870053.html