Declaración básica de MySQL (dos)

Base de datos de operaciones de Python

import pymysql
pymysql.connect()   # 此对象为pymysql连接数据库的类

# 创建Connection连接对象实例
conn = connect(host='localhost', port=3306, user='root', password='mysql', database='python1', charset='utf8')
# 创建游标
cursor = conn.cursor()
# 数据查询
sql = "select id,name from students where id = 7"  
# 数据更新
sql = 'update students set name="刘邦" where id=6'
# 数据删除
sql = 'delete from students where id=6'
# 载入查询语句, 返回的是执行成功的条数,可以用于判断是否执行成功
cursor.execute(sql)
# 接收查询结果、就要一条
result = cursor.fetchone()
# 关闭游标
cursor.close()
# 关闭连接
conn.close() 
 
# 数据更新/或数据新增时
conn.commit()   # 提交
# 事务的回滚  
conn.rollback()

# 查看所有数据 
cursor.fetchall()
cursor.fetchone()
cursor.fetchmany(2)

Restricciones de datos

"""
主键  	primary key
非空 	not null
唯一 	unique
默认 	default
外键 	foreign key
"""
#数据库数据查询
#select 去重选项 字段列表 [as 字段别名] from 数据源 [where子句] [group by 子句] [having子句] [order by 子句] [limit子句];
distinct # 去除重复项
like  # 模糊查询(% 任意多个字符 , _  一个任意字符)
in # 非连续范围内
between ... and ...  # 一个连续的范围内
count(*) # 统计总行数
max()  # 求最大值
min()  #求最小值
sum() # 求和
avg() # 求平均数 
group by # 将查询结果按照1个或者多个字段进行分组,字段值相同的一组
group by + having # 分组后查询指定条件输出的查询结果
having # 只能用于group by 
order by # 排序 (asc升序  desc降序)
select * from 表名 limit start,count  # 分页(从start开始,获取count条数据)
select * from1 inner或left或right join 表2 on 表1.=2.# 连接查询
select * from students where height = (select max(height) from students) # 子查询
# 创建数据表
create table student(sid int(4) not null primary key,sname varchar(36),gid int(4) not null);
# 添加外键
alter table 表名 add constraint 外键名字 foreign key(外键字段名) references 外表表名(主键字段名)
# 删除外键
alter table 表名 drop foreign key 外键名;

Ver sección

# 视图创建
create view 视图名称 as select语句;
# 视图查看(查看表时会显示所有视图)
show tables;
# 使用视图
select * from v_stu_score;#(v_stu_score 视图名)
# 删除视图
drop view v_stu_sco;

Indice

"""
# 索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),包含着对数据表里所有记录的引用指针
# 300 万左右数据量,一半数据量,提高查询

建立索引的情况
1、主键自动建立索引
2、频繁作为查询条件的字段因该建立索引
3、查询中与 其他表关联的字段,外键关系建立索引
4、在高并发的情况下创建复合索引
5、查询中排序的字段、排序字段若通过索引去访问大大提升排序速度(建立索引的顺序跟排序的顺序保持一致)
"""
# 查看索引
show index from "表名"# 创建索引
create [unique] index "索引名称" on "表名(字段名称(长度))"
create index idx_name on students(name(30));  # 单值索引
# 删除索引
drop index "索引名称" on "表名"; 

Negocios

"""
事务:就是一系列的操作,一旦出现问题则进行回滚
事务四大特性:
1、原子性(不可分割的最小工作单元)
2、一致性(数据库的状态总是从一个状态转换到另外一个一致的状态)
3、隔离性(一个事务所作的修改在最终提交前对其他事务是不可见)
4、持久性(一旦事务提交、修改将永远保存到数据库中)
"""
#事务开启
begin "或" start transaction
# 事务提交
commit;
# 回滚事务
rollback;
# 查看user表结构
desc user;
# 查看所有用户
select host,user,authentication_string from user;
# 创建账号& 授权
grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
# 退出root登陆
quit

Motor de almacenamiento

# 查看存储引擎
show engines;

**Innodb** 
# Innodb 存储引擎特点 —— 最大程度的支持并发

# 使用表空间进行数据存储(on/off)
# 系统表空间会产生I/O瓶颈,刷新数据的时候是顺序进行的,所以会产生文件的I/O瓶颈,独立表空间可以同时向多个文件刷新数据。
show variables like 'innodb_file_per_table' # 查看是否独立表空间
set global innodb_file_per_table = off    # 关闭独立表空间

# 1、支持主外键
# 2、支持事务(ACID)
# 3、行级锁,最大程度支持并发
# 4、缓存索引 + 真是数据
# 5、表空间大

**MyISAM**
# MyISAM 存储引擎特性—— 适合非事务应用、只读类应用
# 支持表数据的压缩(linux) - 压缩后变只能读,不能写入
myisampack -b -f myIsam.MYI 
# 表损坏修复
reapir table "表名";
# 1、不支持主外键
# 2、不支持事务 - 适合读类型
# 3、表级锁、不适合高并发
# 4、只缓存索引、不缓存真是数据
# 5、表空间小

**CSV**
# **CSV引擎特点**
# 1、.csv文本存储表内容
# 2、.CSM 文件存储表的元数据,如表状态和数据量
# 3、.frm 文件存储表结构信息

# 4、适合做数据交换的中间表
# 5、不支持主键、不支持自增,所有列不能为空

**Memory** # 内存
# Memory存储引擎
# 1、支持hash(用于等职查找)、btree 索引(范围查找)
# 2、所有字段长度固定
# 3、不支持blob 和text等大字段
# 4、使用表级锁
# 5、重启数据就消失了

Cómo elegir el motor de almacenamiento
1, transacción
2, copia
de seguridad 3, recuperación de fallos

Punto de referencia

"""
基准测试 : 一种测量和评估软件性能指标的活动用于建立某时刻的性能基准,以便当系统发生软硬件变化时,重新进行基准测试以评估变化对性能的影响
基准测试页准对系统设置的一种压力测试
用于评估服务器的处理能力

测试目的
1、建立Mysql 服务器的性能基准线,确定当前Mysql服务器运行情况
2、模拟比当前系统更高的负载,已找出系统的扩展瓶颈
3、测试不同的硬件、软件、操作系统配置
4、证明新的硬件设备是否 配置正确

测试工具 
mysqlslap 
"""
# 参数命名
--auto-generate-sql 	# 由系统自动生成SQL脚本进行测试
--auto-generate-sql-add-autoincrement 	# 在生成的表中增加自增ID
--auto-generate-sql-load-type 	# 指定测试中使用的查询类型
--auto-generate-sql-write-number 	# 指定初始化数据时生成的数据量
--concurrency 	# 指定并发线程的数量
--engine 	# 指定要测试表的存储引擎,可以用逗号分割多个存储引擎
--no-drop 	# 指定不清理测试数据
--iterations 	# 指定测试运行的次数
--number-of-queries 	# 指定每一个线程执行的查询数量
--debug-info 	# 指定输出额外的内存及CPU统计信息
--number-int-cols 	# 指定测试表中包含的INT类型列的数量
--number-char-cols 	# 指定测试表中包含的varchar类型的数量
--create-schema 	# 指定了用于执行测试的数据库的名字
--query 	# 用于指定自定义SQL的脚本
--only-print 	# 并不运行测试脚本,而是把生成的脚本打印出来

# 测试案例
mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-
cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb
--number-of-queries=10 --create-schema=test

orden de ejecución de sentencias sql

# 查询代码
select distinct 
    <select _list>
from 
    <left_table>
join  <right_table> on <join_codition>
where
    <where_condition>
group by
    <group_by_list>
having
    <having_condition>
order by
    <order_by_condition>
limit <limit number>

# 代码读取顺序
1、form
2、on
3、join
4、where
5、group by
6、having
7、select
8、distinct
9、order by
10、limit

explicar la declaración

"""
模拟优化器执行sql查询语句,分析查询语句的表结构性能瓶颈

分析方面:
1、表的读取顺序
2、数据读取操作的操作类型
3、哪些索引可以使用
4、哪些索引实际被使用
5、表之间的引用
6、每张表有多少行被优化器查询
"""
explain select * from t1,t2,t3 where t1.id=t2.id and t1.id = t3.id and t1.other_column='';
"""
解析:
id— 表的读取加载顺序
1、id相同、执行顺序由上而下
2、id不同、id值越大优先级越高、越先被执行

select_type — 数据读取操作的操作类型
1、simple 简单的查询
2、primary 查询中若包含任何负责的子部分、最外层查询则被标记
3、subquery  在select 或where列表中包含了子查询
4、union  若第二个select出现在union之后,则被标记为union
5、union result 从union表获取结果的select
"""

configuración de maestro-esclavo mysql

"""
**主从数据库复制三步骤**
1、master 将改变记录到二进制日志。这些记录过程叫做二进制日志事件,binary log events.
2、slave 将 master 的binary log events 拷贝到它的中继日志
3、slave 重做中继器日志中的事件,将改变应用到自己的数据库中,mysql复制是异步的且串行

**复制的基本原则**
1、每个slave 只有一个master
2、每个slave 只能有一个唯一的服务器ID
3、每个master 可以有多个salve
"""
# 主从配置

# 主机配置文件 - my.ini 
# 开启二进制日志
# log-bin = 自己本地的路径/mydqlbin 
log-bin = mysql-bin
# 指定主服务器ID
server-id =1
# 需要从新启动服务


# 从机配置文件 - mysqld.cnf
server-id = 2  # 不要和主服务器ID重复
log-bin = /自己本地的路径/mysql-bin.log
service mysql restart  # 重启服务

# MySQL8.0主从配置 对从机进行授权
# 192.168.0.183 为从机IP
# 用户名 repl    密码 : 123
CREATE USER 'repl'@'192.168.0.183' IDENTIFIED WITH mysql_native_password BY '123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.183';

show master status;
# 展示 :( file:mysql-bin.000004   Position : 680 )

# 对从机进行配置
# 主机IP地址
change master to master_host = '192.168.0.161',
# 主机用户名
master_user = 'juran',
# 密码
master_password = '123',
master_log_file = 'binlog.000004',
master_log_pos= 908;

Partición de base de datos

partition	# 分区
# 查看数据库支持项
show plugins;

# 数据库分区特点
# 逻辑上为一个表,在物理上存储在多个文件中
create table `login_log`(
	login_id int(10) unsigned not null comment '登录用户id',
	login_time timestamp not null default current_timestamp,
	login_ip int(10) unsigned not null comment '登录ip'
	)engine=innodb default charset=utf8 
	partition by hash(login_id) partitions 4;   # 将这个表划分4个分区


# 删除分区(表中的数据也会删除)
alter table login_log_list drop partition p0;

 # 分区的数据迁移(p1分区数据迁移到table arch_login_log_list )
 alter table login_log_list exchange partition p1 with table arch_login_log_list;

# 分区使用的注意事项
# 1.结合业务场景选择分区键,避免跨分区查询
# 2.对分区表进行查询最好在where从句中包含分区键
# 3.具有主键或唯一索引的表,主键或唯一索引必须是分区键的一部分

# 分区的类型
1、Range分区
2、List分区
3、Hash分区
"""
**分区键**
分区引入分区键的概念,分区键用于根据某个区间值,特定值,或者HASH函数执行数据的聚集,让数据根据规则分布在不同的分区中。 

**分区的类型**
1、Range分区
2、List分区
3、Hash分区
"""

Partición de rango

"""
Range分区特点
1、根据分区键值的范围把数据行存储到表的不同分区中
2、多个分区的范围要连续,但是不能重叠
3、分区不包括上限、取不到上限值

Range分区使用场景
1、分区键为日期或者时间类型
2、经常运行包含分区键的查询,mysql可以很快的确定只有某一个或某些分区需要扫描
3、定期按分区范围清理历史数据
"""

# 建立Range分区
create table `login_log_range`(
	login_id int(10) unsigned not null comment '登录用户ID',
	login_time timestamp not null default CURRENT_TIMESTAMP,
	login_ip int(10) unsigned not null comment '登录ip'
	)engine=innodb
	partition by range(login_id)(
	partition p0 values less than(10000), # 实际范围0-9999
	partition p1 values less than(20000), # 实际范围10000-19999
	partition p2 values less than(30000),
	partition p3 values less than maxvalue # 存储大于30000的数据
);

Partición de hash

"""
Hash分区特点
1、根据MOD(分区键、分区值)的值把数据行存储到表的不同分区内
2、数据可以平均的分布在各个分区中
3、Hash分区的键值必须是一个INT类型的值,或通过函数可以转为INT类型
"""

# 建立Hash分区表
create table `login_log`(
	login_id int(10) unsigned not null comment '登录用户ID',
	login_time timestamp not null default CURRENT_TIMESTAMP,
	login_ip int(10) unsigned not null comment '登录ip'
	)engine=innodb default charset=utf8 
	partition by hash(login_id) partitions 4;

# 时间类型用函数转化为整数
create table `login_log`(
	login_id int(10) unsigned not null comment '登录用户ID',
	login_time timestamp not null default CURRENT_TIMESTAMP,
	login_ip int(10) unsigned not null comment '登录ip'
	)engine=innodb default charset=utf8 
	partition by hash(UNIX_TIMESTAMP(login_time))partitions 4;

Partición de lista

"""
list分区特点
1、按分区键值取值的列表进行分区
2、同范围分区一样、各分区的列表值不能重复
3、每一行数据必须能找到对应的分区列表,否则数据插入失败
"""
create table `login_log_list`(
	login_id int(10) unsigned not null comment '登录用户ID',
	login_time timestamp not null default CURRENT_TIMESTAMP,
	login_ip int(10) unsigned not null comment '登录ip',
	login_type int(10) not null
	)engine=innodb
	partition by list(login_type)(
	partition p0 values in(1,3,5,7,9),
	partition p1 values in(2,4,6,8)
	);
50 artículos originales publicados · Me gusta3 · Visitas 1799

Supongo que te gusta

Origin blog.csdn.net/weixin_43056654/article/details/103835281
Recomendado
Clasificación