mysql优化

技能专题:

熟悉mysql,sqlsever,oracle数据库,熟悉redis,memcache等nosql

 

存储过程--》事务--》锁--》结构--》sql执行流程--》索引理解--》主从--》

分库分表

 

熟悉mysql,sqlserver,oracle数据库,熟悉redis,memcache,等nosql

简历讲究一个点 技能描述:细致,熟悉程度

 

熟悉mysql数据库,对于mysql结构

以及sql的执行有过深入细致的了解,能根据慢查询日志对于执行慢的sql,

进行分析,同时会根据页面+表结构+做索引

 

熟悉mysql数据库,对于mysql结构以及sql的执行有做过深入的了解,

熟悉慢查询分析,索引的结构,有搭建主从。

 

2:主从的好处

 

mysql做主从在多少数据量下考虑?

主从不能够提升mysql的sql执行速度,服务抗压能力

一定要到数据达到多少才做这个实际(和数据有点关系),项目运行,读:写,

比例

 

mysql:最大连接数

回答面试官:

mysql问题,多不要立即回答问题点

 

1:影响mysql的性能cpu i3-8 1000W select 30s - 5m

2:项目的运行比例 读:写 =》1000:20 | 20:1000 短时间内500

3:服务系统-》版本-》cpu 5000w 主从 数据库 5g

缓解服务器并发压力

 

 

主从表如何设置索引:

主库可以不设置索引,从库设置索引

 

主从复制几个模式:

sql复制模式,行模式,混合模式

 

1:主库配置

开启binlog server_id = 1

需要给以从库能操作的账号 - 创建一个账号

分配账号的权限

2:从库配置

开启binlog 设置sever_id 不能与主库相等

指定主库的信息(ip,password,host等)

 

误操作:对于数据删库,可以根据binlog恢复数据

 

binlog日志过大怎么办?

迁移备份,删除久远无用的历史记录

 

1:主库本来有数据,从库怎么同步

冷:不一定关闭服务器,而是指停止服务器写操作 mydumper

2:一致性检查

检测并解决同步

热:在服务不停止写的时候,去备份 xtracbackup

3:延迟问题

4:服务器死机

 

数据库层面:配置innodb_xx_commit sync_binlog

硬件:升级从库配置,宽带

 

 

主从mysql proxy

建立数据库集群

 

 

pt-table-sync:主从同步

 

pt-table_usage :检测可用

 

复制的方式:主从是如何复制数据?

 

1:基于sql语句的复制 - 传统型 默认

从库 - 根据主库执行的sql再执行一次

优点:灵活性较大,不要求主从版本一致

缺点:主库执行的sql需要获取系统时间 - 从库产生了延迟,使用now()

函数时。

 

mysql5.1后

2:基于行的复制

优点:可以有效避免now()执行的误差

缺点:对于数据库要求版本一致(尽量),不能确定执行的sql,

修改表结构不能同步

 

3:混合式复制 两者的混合

通过配置binlog_format = mixed 参数

 

对于表修改主库影响从库

 

 

 

分表查询问题:分页,关联

 

已经有个很大的数据表,很慢,并且正在使用,你怎么且不影响现在的查询

1:项目正在运行,现在的查询只能说勉强ok,问题项目正在运行,不敢去动

 

1解决:数据备份=》热备份=》通过热备份到测试服务器=》数据表结构的梳理,

根据业务选择分表规则=》因为数据量很大,普通范围查询必然很慢=》

那么可以根据规则选择对应的主键作为查询的条件=》也可以选择对于分片的字段

建立索引获取相关的主键=》主键作为条件查询导入对应分表中

 

表分好后,查询可以使用mycat=》在凌晨对项目修改

1:不能随便删除数据

2:要知道数据对于业务的重要性

3:可以做个切分

 

表分区(分片) 分区可以配合与分表一起使用

物理切分 规则range,list,hash,key

 

场景:

表非常大无法全部存在内存

维护=》批量删除

 

限制:1024可能随版本改变而改变

无法使用外键--数据库存储引擎一致

 

如果分区有主键或唯一索引的字段,那么所有主键和唯一索引就包含进来

 

range:根据范围分区,

例子:

CREATE TABLE teacher(

`id` INT,

`name` VARCHAR(20),

`class` VARCHAR(20),

age INT,

bir DATE

)PARTITION BY RANGE(age)

(

PARTITION p1 VALUES LESS THAN(20),

PARTITION p2 VALUES LESS THAN(40),

PARTITION p3 VALUES LESS THAN(60),

PARTITION p4 VALUES LESS THAN(80),

PARTITION p5 VALUES LESS THAN(MAXVALUE)

);

 

p1 => (age < 20)

p2 => (age < 40)

p3 => (age < 60)

p4 => (age < 80)

 

当插入时自动分区:

 

INSERT INTO teacher VALUES(1,'s','php',18,'2001-10-10');

INSERT INTO teacher VALUES(1,'s','php',20,'1999-10-10');

INSERT INTO teacher VALUES(1,'s','php',38,'1979-10-10');

INSERT INTO teacher VALUES(1,'s','php',48,'1969-10-10');

INSERT INTO teacher VALUES(1,'s','php',58,'1959-10-10');

INSERT INTO teacher VALUES(1,'s','php',68,'1949-10-10');

INSERT INTO teacher VALUES(1,'s','php',78,'1939-10-10');

 

 

'range' 根据给定的值去计算范围做分区 between

‘list’ 指定分区的类型值

 

CREATE TABLE teacher(

`id` INT,

`name` VARCHAR(20),

`class` VARCHAR(20),

age INT,

bir DATE

)PARTITION BY list(age)

(

PARTITION p1 VALUES in(20,40),

PARTITION p2 VALUES in(60,80),

PARTITION p3 VALUES in(90),

);

 

‘hash’ =>针对函数的value分区=》分区(规则)是mysql自动完成的

 

 

CREATE TABLE teacher(

`id` INT,

`name` VARCHAR(20),

`class` VARCHAR(20),

age INT,

bir DATE

)PARTITION BY hash(year(bir))

partition 4

 

explain select * from teacher partition (p0)

 

'key' => 把hash改为key

 

分区有点类似于分表=》他自己实现了数据的处理,项目使用中会分表分区结合

一起,可提高单表查询能力

 

分区与分表区别,分区的原理

 

 

 

 

场景:单表太大,内存不能一下存放

读写: select

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值