首页 > 其他分享 >存储引擎-1

存储引擎-1

时间:2025-01-10 13:31:32浏览次数:3  
标签:存储 log 引擎 参数 flush 过程 out

简介

相当于Linux文件系统,只不过比文件系统强大

功能

数据读写

数据安全和一致性

提高性能

热备份

自动故障恢复

高可用方面支持

查看存储引擎

show engines;

常见存储引擎:

InnoDB、MyISAM、MEMORY、CSV

MySQL5.7默认的存储引擎:InnoDB

PerconaDB默认是:XtraDB

MariaDB默认是:InnoDB

第三方的存储引擎:

RocksDB、MyRocks、TokuDB

压缩比高,数据的插入性能高,其他功能和InnoDB没差别

RocksDB:是领先的嵌入式键值存储引擎,已在各行各业得到广泛应用。Meta、微软、Netflix和Uber等知名公司都已将RocksDB集成到生产环境

MyRocks、RocksDB:是facebook基于LevelDB实现的,目前为facebook内部大量业务提供服务

TokuDB:是一个开源的高性能存储引擎,适用于MySQL和MariaDB

InnoDB和MyISAM的区别

  1. InnoDB支持事务
  2. InnoDB支持外键
  3. InnoDB是聚集索引,MyISAM是非聚集索引
  4. InnoDB不保存表的具体行数,而MyISAM用一个变量保存了整个表的行数
  5. Innodb不支持全文索引,而MyISAM支持全文索引
  6. MyISAM表格可以被压缩后进行查询操作
  7. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁  //锁就是改的时候别人不能看,看到时候不能别人改
  8. InnoDB表必须有唯一索引
  9. Innodb存储文件有frm(列)、ibd(表),而Myisam是frm(列)、MYD(行)、MYI(索引)

简历案例---zabbix监控系统架构整改(2000多台主机)

环境:zabbix 3.2    mariaDB 5.5  centos 7.3

现象:zabbix卡的要死 , 每隔3-4个月,都要重新搭建一遍zabbix,存储空间经常爆满.

问题 :

  1. zabbix 版本
  2. 数据库版本
  3. zabbix数据库500G,存在一个文件里

优化建议:

  1. 数据库版本升级到mariaDB最新版本,zabbix升级更高版本
  2. 存储引擎改为tokudb
  3. 监控数据按月份进行切割(二次开发:zabbix 数据保留机制功能重写,数据库分表)
  4. 关闭binlog和双1(双1是mysql的日志刷新模式,安全高,但读写性能差)
  5. zabbix监控参数调整

优化结果:

监控状态良好 

为什么?

  1. Mariadb支持TokuDB,经过测试:10版本要比5.5版本性能高 2-3倍
  2. TokuDB:insert数据比Innodb快的多,数据压缩比要比Innodb高
  3. 监控数据按月份进行切割,为了能够truncate每个分区表,立即释放空间
  4. 关闭binlog ----->减少无关日志的记录
  5. 参数调整...----->安全性参数关闭,提高性能

InnoDB 存储引擎核心特性说明

事务

行锁:Myisam为表锁

MVCC:多版本并发控制

外键

ACSR:自动故障恢复(把内存中的数据,关电源的一刻写入到硬盘上)

热备(快照把当前的表拷贝一份,就不会出现缩表的问题了)

复制 (多线程,GTID:全局事务标识,MTS:并行复制)

InnoDB和MyISAM存储引擎的替换(客户案例)

环境:centos 5.8 ,MySQL 5.0版本,MyISAM存储引擎,网站业务(LNMP),数据量50G左右

现象问题: 业务压力大的时候非常卡,经历过宕机,会有部分数据丢失

问题分析:

  1. MyISAM存储引擎表级锁,在高并发时,会有很高锁等待
  2. MyISAM存储引擎不支持事务,在断电时会有可能丢失数据

职责:

  1. 监控锁的情况:有很多的表锁等待
  2. 存储引擎查看:所有表默认是MyISAM

解决方案:

  1. 先升级mysql 5.5,再升级MySQL 5.6版本
  2. 迁移所有表到新环境
  3. 开启双1安全参数

mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性的关键参数。下面从参数含义,性能,安全角度阐述两个参数为不同的值时对db 性能、数据的影响

  • 参数意义:

innodb_flush_log_at_trx_commit

设置为0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作

设置为1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去

设置为2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作

注意:由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作"并不是保证100%的"每秒"

sync_binlog(二进制日志)

默认值是0,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log

当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去

注意:如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作

  • 性能

查看当前参数值(默认双一模式):

show variables like 'innodb_flush_log%';

show variables like 'sync_binlog%';

两个参数在不同值时对db的纯写入的影响表现如下:

测试场景1

innodb_flush_log_at_trx_commit=2

sync_binlog=1000

测试场景2

innodb_flush_log_at_trx_commit=1

sync_binlog=1000

测试场景3

innodb_flush_log_at_trx_commit=1

sync_binlog=1

在以上3个场景下的TPS分别为:

场景1           41000

场景2           33000

场景3           26000

由此可见,当两个参数设置为双1的时候,写入性能最差,sync_binlog=N (N>1 ) innodb_flush_log_at_trx_commit=2 时,(在当前模式下)MySQL的写操作才能达到最高性能。

  • 安全

当innodb_flush_log_at_trx_commit和sync_binlog 都为 1 时是最安全的,在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。但是鱼与熊掌不可兼得,双11 会导致频繁的io操作,因此该模式也是最慢的一种方式。

当innodb_flush_log_at_trx_commit设置为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。

当innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。

"双1设置"适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如订单,交易,充值,支付消费系统。双1模式下,当磁盘IO无法满足业务需求时 比如11.11 活动的压力。推荐的做法是 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N为500 或1000) 且使用带蓄电池后备电源的缓存cache,防止系统断电异常。

存储过程定义(类似shell脚本,但提前编译好了二进制存储起来,比直接执行命令提高速度2-7倍)

存储过程是一组为了完成特定功能的 SQL 语句集合。

使用存储过程的目的是将常用或复杂的工作预先用SQL语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。

存储过程的优点

  • 封装性

存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句,并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。

  • 可增强 SQL 语句的功能和灵活性

存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

  • 可减少网络流量

由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。

  • 高性能

存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。

  • 提高数据库的安全性和数据的完整性

使用存储过程可以完成所有数据库操作,并且可以通过编程的方式控制数据库信息访问的权限。

总结:调用存储过程名称,不用写语句

创建实验数据库和表并写入内容

create database school default charset utf8mb4 collate utf8mb4_bin;

use school;

create table tb_students_score (student_name char(20) not null,student_score int);

insert into tb_students_score values ('dany','90'),('green','99'),('henry','95'),('jane','98'),('jim','88');

创建无参数存储过程

delimiter //

create procedure showstuscore()

begin

select * from tb_students_score;

end //

delimiter ;

调用存储过程

call showstuscore();

创建有参数的存储过程

delimiter //

create procedure getscorebystu

(in name varchar(30))

begin

select student_score from tb_students_score

where student_name=name;

end //

delimiter ;

调用存储过程

call getscorebystu('green');

修改存储过程

ALTER PROCEDURE <过程名> [ <特征> … ]

删除存储过程

drop procedure getscorebystu;

查看存储过程

show procedure status;

查看创建存储过程语法

show create procedure showstuscore;

存储过程的参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型IN、OUT、INOUT

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

  • in 输入参数(外面可以影响里面,但里面影响不了外面,全局影响局部,但是局部不能影响全局)

delimiter //

create procedure in_param(in p_in int)

begin

select p_in;

set p_in=2;

select p_in;

end //

delimiter ;

set @p_in = 1;

call in_param(@p_in);

select @p_in;

可以看出,p_in 在存储过程中被修改,但并不影响 @p_in 的值,因为前者为局部变量,后者为全局变量

  • out输出参数

delimiter //

create procedure out_param(out p_out int)

begin

select p_out;

set p_out = 2;

select p_out;

end //

delimiter ;

set @p_out = 1;

call out_param(@p_out);

因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null

select @p_out;

调用了out_param存储过程,输出参数,改变了p_out变量的值

  • inout输入参数

delimiter //

create procedure inout_param(inout p_inout int)

begin

select p_inout;

set p_inout = 2;

select p_inout;

end //

delimiter ;

set @p_inout = 1;

call inout_param(@p_inout);

调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量

标签:存储,log,引擎,参数,flush,过程,out
From: https://blog.csdn.net/2402_88627342/article/details/144986760

相关文章

  • 【机器学习】农业 4.0 背后的智慧引擎:机器学习助力精准农事决策
    我的个人主页我的领域:人工智能篇,希望能帮助到大家!!!......
  • sql存储过程和用户定义函数 (UDF) 的具体实操
    存储过程和用户定义函数(UDF)的具体实操为了提供更具体的实操指导,创建一个实际的数据库环境,并在此基础上编写和测试存储过程与用户定义函数(UDF)。使用MySQL作为示例数据库管理系统(DBMS),但这些概念和大部分代码可以适用于其他SQL兼容的DBMS,如PostgreSQL、SQLServer等。环......
  • 如何把电脑上文件云存储,把电脑上文件云存储的方法
    怎么把电脑上的文件云存储呢?在私有云存储中,设置文件自动同步是最简单的方法。在私有云环境中进行文件同步备份是确保数据安全、便捷访问和管理的重要手段。通过将文件同步到私有云服务器,用户可以在多个设备间实时同步文件,同时确保备份的数据不会丢失。下面是如何在私有云电脑上实......
  • 在使用 PbootCMS 的 IP 黑名单功能时,如果发现只能添加 10 多条 IP 地址,多了保存不了,通
    1.备份数据库在进行任何数据库操作之前,请务必备份数据库,以防数据丢失。mysqldump-uyour_username-pyour_database_name>backup.sql2.登录数据库管理工具使用phpMyAdmin或其他数据库管理工具登录到您的MySQL数据库。3.修改 ay_config 表结构找到 ay_conf......
  • 秒懂虚拟化(一):从概念到网络、存储虚拟化全解析,通俗解读版
    1、虚拟化技术的概念虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。---百度百科2、什么是虚拟......
  • C++ 如何存储类型信息
    在C++中,保存和遍历类型信息可以通过多种方式实现,具体取决于你想要达到的目标。以下是几种常见的方法:1.使用 typeid 和 type_infoC++提供了typeid操作符和std::type_info类来获取运行时类型信息(RTTI)。你可以使用这些工具来保存类型信息并在需要时进行比较或输出。示例......
  • C# 类(Class)及其在 Unity 引擎开发中的应用总结
    1.什么是C#类?在C#中,类(Class)是一种用户定义的数据结构,用于封装一组数据(字段)和操作数据的方法。类是面向对象编程(OOP)的核心,它支持封装、继承和多态等特性。1.1类的基本结构一个类通常由以下部分组成:字段(Fields):存储数据或状态。属性(Properties):封装字段,提供安全的访......
  • C# 多态性及其在 Unity 引擎开发中的应用总结
    1.什么是多态性?多态性(Polymorphism)是面向对象编程(OOP)的核心特性之一,指同一个接口或方法可以根据对象的不同类型表现出不同的行为。多态性通常通过继承和接口实现,主要体现在以下两种形式:方法重写(Override):子类通过重写父类的虚方法实现不同的行为。方法重载(Overload):......
  • IBM Storage - 支持AI应用场景的数据存储软硬件解决方案
    概述    为了解决数据和工作负载在各地分散的现状,需要实现对存储在分布式文件和对象存储系统中的大量非结构化数据的高速访问。IBMStorage利用人工智能(AI)、机器学习(ML)和高级分析手段,对数据存储基础架构进行现代化改造。IBMStorage不仅仅是一套存储产品和解决方案,其......
  • MySQL 存储引擎
    存储引擎是处理不同表类型SQL操作的MySQL组件。MySQL服务器采⽤可插拔的存储引擎架构,在服务器运⾏时可以动态的加载和卸载。查看当前服务器⽀持哪些存储引擎可以使⽤showengines 语句,Engine表⽰:存储引擎的名称,Support:表⽰当前服务器是否⽀持,值分别为:YE......