• [技术干货] mysql5.1安装_mysql5.1.26安装配置方法详解
    MySQL安装与配置 MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。1、所用MySQL的版本为:MySQL_5_1_26.msi; 2、下载好软件后双击进入以下界面: 3、点击Next,进入以下界面: 4、选择“Custom”后,点击Next,进入以下界面: 5、然后点击图中所有的下拉可选项(总共四个),选择第二个选项,即“This feature,and all subfeatures,will be...”;其中的一个示例截图如下: 6、然后点击“Change”按钮,将安装路径改为:D:\MySQLsetup\;改完后的截图如下: 7、然后点击“Next”按钮,进入下个页面后点击“Install”按钮,然后等会儿会出现另一个界面,一直点击“Next”,进入以下界面: 8、然后勾选“√”(默认已经勾选)后点击“Finish”;然后在D:\MySQLsetup\bin目录下找到MySQLInstanceConfig.exe后双击,出现以下界面: 9、点击“Next”后出现以下界面: 10、选择第一个“Detailed Configuration”(默认选项),然后点击“Next”,进入以下界面: 11、选择第一个“Developer Machine”(默认选项),然后点击“Next”,进入以下界面: 12、选择第一个“Multifunction Database(默认选项),然后点击“Next”,进入以下界面: 13、这里可以修改路径,不过直接用默认的即可,直接点击“Next”,进入以下界面: 14、直接点击“Next”即可,进入以下界面: 15、点击“Next”后进入以下界面: 16、此时,选择第三个“Manual Selected...”,然后点击下拉框找到并选择“gb2312”,从而会支持中文,选择后如图所示: 17、然后点击“Next”,进入以下界面: 18、此时勾选“Include Bin...”后点击“Next”,然后出现的界面是: 19、在此界面设置root和密码,设置密码为“123456”(由于一开始安装没有设置密码,所以Current root password处不用填写),勾选“Enable...”然后界面如图所示: 20、然后点击“Next”后出现以下界面: 21、点击“Execute”后,出现以下界面然后点击“Finish”,则配置成功: 以上就是mysql 5.1.26安装配置方法,希望对大家的学习有所帮助。 ————————————————                    原文链接:https://blog.csdn.net/weixin_39895181/article/details/113117110 
  • [技术干货] 小白MySQLwindow10/11下载傻瓜式教程
    前言MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL作为网站数据库。一、下载MySQL1、打开浏览器(360、火狐等都行)这里用Edge浏览器演示。2、输入这串地址:https://www.mysql.com/,点击搜索。3、点击此处进入官网4、进入如下界面后点击DOWNLOADS/下载(有人进入中文界面就会显示“下载”)5、点击后进入下面这个界面:6、向下滑动,找到此处点击打开7、进入后,找到 MySQL installer for Windows点击打开8、进入此界面点击第二个下载9、点击此处,跳过注册直接安装10、点击此处找到安装包并打开二、安装MySQL1、打开文件后等待一会,进入此界面,点击YES2、进入后选择第三个,然后点击NEXT3、之后会进入这个界面,点击Execute,然后等待各组件安装完成4、各组件安装好后点击NEXT5、直接next开始配置MySQL6、进入此界面选择第一个NEXTEXT7、接下来会让我们选择密码认证方式,第一个为强密码,第二个为传统密码,这里建议选强密码。演示中我选择的是弱密码。8、配置密码上面是设密码,下面是让你确认密码,切记密码不要忘。然后next如下图所示:9、默认,NEXT10、 配置文件权限默认选第一个11、显示配置,直接Execute,等待配置完成跳转界面等待配置完成点击Finish12、Execute13、接下来的几个界面保持默认配置,Next14、输入刚设的密码15、跟着点三、查看1、点左下角2、输MySQL3、点击打开文件位置将快捷模式拖到桌面4、没了————————————————原文链接:https://blog.csdn.net/ls5633/article/details/135567242
  • [技术干货] MySQL的下载和安装(msi)
    使用msi安装的优点:  在使用zip手动安装后,隔一段时间MySQL服务会自动关闭,需要再次手动重启MySQL服务。而使用msi安装程序会避免这个问题,但安装过程有点繁琐。 msi官网下载步骤: MySQL :: Download MySQL Community Server https://dev.mysql.com/downloads/mysql/  第一步:进入官网下载界面: 如果下载msi安装包,可以直接点击go to downloads page>进入msi下载界面;  第二步:下载msi安装包 先选择你要安装MySQL的设备的操作系统,然后点击download下载;我演示的是Windows系统下的MySQL安装;这里建议下载第二个,安装时会更快,第一个需要再次联网下载所需要的文件;  第三步: 点击no thanks,just start my download直接下载msi安装包;  我这里下载的是mysql-installer-community-8.0.29.0 打开安装包后会有两个弹窗,全部点击是;之后开始安装; 第一步:选择安装类型,(我这里选的是常规安装);点击next下一步  第二步:检测需要的安装(这里不用管,直接点next)下一步 第三步: 这里会显示缺少部件(不用管还是点击yes)  第四步:点击Execute,执行安装 第五步:安装执行完成,点击next下一步 第六步:这里是产品配置向导,点击next下一步 第七步:这里是类型与网络没有特别需求就点击next(小编只是初学者所有不改默认的选项)点击next下一步 第八步:因为我使用Navicat Premium 16管理数据库,它默认选第一个,但会与Navicat Premium 16不兼容,所以选择第二个,如图所示,选择完成点击next下一步 第九步:这里需要设置管理员密码(不用猜我用的什么密码-123456-我习惯使用弱口令,不容易忘记密码导致无法启动)个人喜好,在MySQL Root Password后的文本框内填入你的密码,在Repeat Password后的文本框内再次填入刚才输入的密码,点击next下一步(不要忘记密码哦) 第十步:这里将配置Windows服务,一定要保证Start the MySQL Server at System Startup(系统启动时启动MySQL服务器)是被选中的,不然后期需要手动启动服务(很麻烦),我电脑账户使用的是标准系统账户所以选择Standar System Account;点击next下一步 第十一步:这里到了应用配置界面,直接点击Execute安装就好了 第十二步:点击Finish完成(不要急还没有完成安装,还有很多没有完成的) 第十三步:到了产品配置了,不用管直接next下一步 第十四步:这是MySQL路由器配置,没有特殊要求就不去配置它,直接Finish完成,下一步 第十五步:回到产品配置,依旧是点击next下一步 第十六步:在这里注意要在Password后输入之前设置的管理员密码点击Check检查,如图就是检查通过,点击next下一步 第十七步:这是连接到服务器的应用配置,点击Execute应用更改 第十八步:点击Finish完成应用配置;下一步 第十九步:产品配置完成点击next下一步 第二十步:恭喜你安装完成,点击Finish完成安装 第二十一步:完成安装后会跳出这两个界面,说明安装成功;在左边的窗口可以对数据库进行指令操作,右边是MySQL自己的工作台;都可以直接关闭 ———————————————— 原文链接:https://blog.csdn.net/weixin_55107915/article/details/124227166 
  • [技术干货] 最新MySQL8.3.0社区版安装指南
     此次安装的版本为MySQL社区版,即MySQL Community Server。  一、下载安装包 第一步,登录MySQL官网www.mysql.com,进入产品下载页面。  第二步,进入产品下载页面后,向下滑动页面,找到MySQL Community(GPL)Downloads链接并进入。  第三步,选择社区版产品。  第四步,选择安装方式。通常有解压包安装和步骤安装两种方式,这里选择了解压包安装。  第五步,选择无需登录直接下载。  二、解压安装包 第一步,将下载好的安装包转移到你希望安装的文件目录下(我这里是在D盘创建了一个MySQL目录)。 第二步,点击右键全部解压缩。解压后文件目录如下。  三、设置配置文件 在解压目录创建my.ini文件并添加内容如下。  [mysqld] #设置3306端口 port=3306 #服务端使用的字符集默认为UTF8 character-set-server=utf8 #创建新表时将使用的默认存储引擎 default-storage-engine=INNODB [mysql] #设置mysql客户端默认字符集 default-character-set=utf8 [client] #设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8  四、配置系统环境 第一步,windows程序栏搜索系统变量,找到“编辑系统环境变量”并打开如下窗口,点击“环境变量”。 第二步,点击系统变量的窗口下的“新建”按钮,新建一个环境变量MYSQL_HOME,变量值填写解压后的文件地址,点击“确定”保存设置。 第三步,点击系统变量栏的Path变量,并进入编辑页面。 第四步,进入Path变量编辑窗口,点击“新建”,创建一个“%MYSQL_HOME%”变量的引用,并在后面添加bin目录,如下所示。 第五步,全部点确定保存设置。  五、初始化操作 完成环境变量设置后,还需要通过终端对MySQL进行一些初始化操作。注意,要使用管理员权限进入cmd。 第一步,进入MySQL的解压目录。由于MySQL我储存在了D目录,所以需要转换一下盘,然后进入相关目录。终端操作如下。  C:\Users\86130>D: D:>cd D:\MySQL\bin D:\MySQL\bin>  由此进入到了我的解压目录D:\MySQL的bin目录下。 第二步,对MySQL进行初始化。需要注意,此时会产生一个临时密码,后面要用到。这一步出错的话,需要清空data目录下的文件再试。  mysqld --initialize --console  第三步,安装MySQL服务。  mysqld --install  提示Service successfully installed就是安装成功了。 第四步,启动MySQL服务。命令如下。  net start mysql  终端完整操作如下。  D:\MySQL\bin>net start mysql MySQL 服务正在启动 . MySQL 服务已经启动成功。  如此MySQL服务已经成功启动。 第五步,登录MySQL,需要用到之前产生的临时密码。命令如下。  mysql -uroot -p  终端完整操作如下。  如此即进入了MySQL服务中。 第六步,修改root用户密码。修改密码为123456命令如下。  ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘123456’;  完整终端操作如下。  mysql> ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘123456’; Query OK, 0 rows affected (0.01 sec)  第七步,修改root用户权限。命令如下。  create user ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;  完整终端操作如下。另外有朋友反映这个引号格式在复制粘贴时有问题,如果出现问题不妨自己手动输入试试。  mysql> create user ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’; Query OK, 0 rows affected (0.01 sec)  第八步,输入quit即可退出MySQL。 如此,MySQL环境已经搭建完毕。  原文链接:https://gitcode.csdn.net/65e83cfe1a836825ed78b0a8.htm 
  • [技术干货] MySQL安装教程
    下载地址 官方下载地址:MySQL :: Download MySQL Installer 安装步骤 ①双击msi安装程序,进入如下界面,点击custom,点击next ②选择自己要安装的组件 MySQL Server:是数据库服务,要安装这个 。 MySQL Workbench:一款MySQL的ER/数据库建模工具。 MySQL for Visual Studio:你要是使用VS编程,并且要用VS来连接数据库进行表管理就需要装这个。 MySQL for Excel:是一个Excel插件,能让我们在Microsoft excel中处理MySQL数据。 MySQL Notifier :是一款 MySQL 数据库的辅助工具。它可以在系统任务栏通知区域(系统托盘)处驻留图标,用于快捷监视、更改服务器实例(服务)的状态。同时,也可以与一些图形化管理工具(如 MySQL Workbench)集成使用。一般用不到。 MySQL Shell:是MySQL Server的高级客户端和代码编辑器。 MySQL Router:一般用不到。 MySQL Connector :一些连接mysql的驱动包。 MySQL Documentation :一些mysql的官方文档。 windows x64和x86最主要的区别:windows x64是指64位的操作系统,windows x86是指32位的操作系统。所以如果你电脑拥有超过4G的内存,则建议安装64位的操作系统,这是这两者最大的区别. ③自定义安装路径 √首先点击MySQL Server-->advanced option-->设置MySQL Server安装路径  √之后点击Connector/Python-->advanced option-->设置Connector/Python安装路径 √ 之后点击MySQL Shell-->advanced option-->设置MySQL Shell安装路径 ④ready to download ⑤ready to install ⑥之后一直点击next即可,直至出现如下界面,需要设置数据库的密码(友情提示:最好找个地方记下来~) ⑦next即可【可根据个人意愿对服务名称进行修改】 ⑧点击execute ⑨完成 配置环境变量 为什么需要配置环境变量? 环境变量,代表系统的一个全局搜索路径。 当你没有配置环境变量的时候,你想要执行某个目录下的某个程序,就必须找到它的具体位置,才能够执行它。 当不配置环境变量,想要执行某个程序可以吗?当然也是可以的,就拿启动mysql来说,你如果不配置环境变量,就必须在CMD黑窗口中,使用cd命令切换到mysql server下的bin目录下,才可以执行启动。你每次这样启动是不是觉得很麻烦,当你需要经常使用mysql,需要经常执行mysql启动。这就是为什么我们需要配置环境变量的原因。 当配置了某个环境变量,如果你想要执行某个程序,你可以在任何路径下,执行这个程序。首先,系统会在当前目录下,搜索是否存在想要执行的某个程序,假如没有,系统会再去系统环境变量中的目录进行一个个搜索,当搜索到了该程序,便会立即执行。  将MySQL Server安装路径中的bin目录加入path即可。注意:结尾是英文封号 ———————————————— 原文链接:https://blog.csdn.net/weixin_54106682/article/details/128156632 
  • [技术干货] SpringCloud-RabbitMQ消息模型-转载
     本文深入介绍了RabbitMQ消息模型,涵盖了基本消息队列、工作消息队列、广播、路由和主题等五种常见消息模型。每种模型都具有独特的特点和适用场景,为开发者提供了灵活而强大的消息传递工具。通过这些模型,RabbitMQ实现了解耦、异步通信以及高效的消息路由,为分布式系统的开发和部署提供了可靠的基础。阅读本文,读者将深入了解RabbitMQ不同消息模型的应用场景和使用方法,为构建可靠的消息传递系统提供了有益的指导。  一、RabbitMQ消息模型介绍 RabbitMQ 是一种高度可扩展的消息代理,其消息模型基于 AMQP(Advanced Message Queuing Protocol)协议,提供了灵活可靠的消息传递机制。  以下是 RabbitMQ 的核心消息模型组成部分:  组成部分    功能 生产者 (Producer)    生产者负责产生和发送消息到 RabbitMQ 服务器。 将消息发布到特定的交换机(Exchange)。 交换机 (Exchange)    交换机是消息的分发中心,接收生产者发送的消息,并将其路由到一个或多个队列。RabbitMQ 提供不同类型的交换机,如直连交换机(direct)、主题交换机(topic)、扇出交换机(fanout)、头交换机(headers)等,以满足不同的路由需求。 队列 (Queue)    队列是消息的存储地点,消息在队列中等待被消费。 消息按照一定的规则存储在队列中,等待消费者订阅并处理。 绑定 (Binding)    绑定定义了交换机如何将消息路由到特定的队列。 绑定规则由消费者在订阅队列时指定,确保消息按照预期的方式路由。 消费者 (Consumer)    消费者订阅一个或多个队列,接收并处理队列中的消息。消费者从队列中获取消息,完成相应的业务逻辑,然后应答(acknowledge)消息。 路由键 (Routing Key)    路由键是消息从生产者到达交换机时的附加信息,用于指导消息路由到特定的队列。路由键的值与交换机类型和绑定规则相关。 RabbitMQ 的消息模型允许灵活的消息路由和传递,提供了高度可靠性和可伸缩性。生产者通过交换机将消息发送到队列,而消费者则订阅队列并处理消息。这种模型使得系统能够实现解耦、异步通信,同时确保消息在分布式环境中的可靠传递。  二、RabbitMQ常见消息模型 MQ(消息队列)在应用中有多种常见的消息模型,其中包括以下五种:  1、基本消息队列 基本消息队(Basic Queue) 列是最简单的消息传递模型。在这个模型中,生产者发送包含简单信息如 "Hello World!" 的消息到队列,而消费者则接收并处理这些消息。这种模型适用于简单的场景,如需要一对一通信的情况。  示意图:   2、工作消息队列 工作消息队列(Work Queue)用于在多个工作者(消费者)之间分发任务。生产者将任务发送到队列,多个工作者可以并发地处理这些任务。这种模型有效地实现了任务的分发和并行处理。  示意图:   3、发布订阅 发布订阅(Publish/Subscribe) 模型采用广播方式,生产者将消息发送到交换机,多个队列通过订阅交换机接收消息,实现一对多的消息传递。   根据交换机类型不同,发布订阅模型又分为三种:  ① 广播交换机(Fanout Exchange) 广播交换机(Fanout Exchange)是一种简单而强大的消息传递模型。当生产者发送消息到Fanout Exchange时,该交换机会将消息广播到所有与之绑定的队列,无论它们的路由键是什么。这使得多个队列能够同时接收相同的消息,实现了一对多的消息传递  示意图:   ② 直连交换机(Direct Exchange) 直连交换机(Direct Exchange)通过使用指定的路由键,将消息传递到与之匹配的队列。这种模型适用于需要将消息精确路由到特定队列的场景。生产者发送消息时,可以指定一个或多个路由键,而队列在绑定交换机时也需要指定相应的路由键,从而实现精准的消息路由。  示意图:   ③ 主题交换机(Topic) 主题交换机(Topic Exchange)允许消息的路由键与队列的绑定模式进行模糊匹配,从而实现更灵活的消息订阅和路由。路由键可以使用通配符(和#),其中星号()代表一个单词,井号(#)代表零个或多个单词。这种模型使得队列能够订阅符合特定模式的消息,而不仅仅是固定的路由键。  示意图:   这五种消息模型展示了RabbitMQ在不同场景下的应用,为开发者提供了多样的选择,以满足各种消息传递需求。    三、RabbitMQ消息模型总结 RabbitMQ作为高度可扩展的消息代理,其消息模型基于AMQP协议,提供了强大的消息传递机制。核心组成部分包括生产者、交换机、队列、绑定和消费者等。消息模型允许实现灵活的消息路由和传递,提供了高度可靠性和可伸缩性。通过交换机将消息发送到队列,消费者订阅队列并处理消息,实现了解耦、异步通信,确保消息在分布式环境中的可靠传递。 ​ ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/weixin_41793160/article/details/136466366 
  • [技术干货] MySQL 篇-深入了解 DDL 语言(一)-转载
         1.0 MySQL 说明         MySQL 是一种关系型数据库管理系统,它支持使用 SQL(Structured Query Language)来管理和操作数据库。SQL 是一种标准化的数据库查询语言,包括 DDL、DML、DQL、DCL 和 TCL等不同类型的语句。          2.0 DDL 语言         DDL 是数据定义语言(Data Definition Language)的缩写,是一种用于定义数据库结构和模式的语言。DDL 包括创建、修改和删除数据库表、视图、索引等数据库对象的语句。常见的 DDL 语句包括 CREATE、ALTER 和 DROP 等。因此,DDL 不是一种独立的编程语言,而是用于管理数据库结构的语言。简单来说, DDL 就是对数据库、表进行增加、删除、查询、修改。          2.1 DDL 语言 - 定义数据库         用 DDL 语言来对数据库的操作主要有一下四点:创建数据库、查询当前的数据库、使用指定的数据库、删除数据库。          2.1.1 创建数据库操作 创建数据库的 SQL 语句为:  create database [ if not exists ] 数据库名;         对于 [ if not exists ] ,翻译为:"如果改数据库不存在" 。这段代码可写可不写,没有强制要求。主要区别是,若没有加上这段代码且存在该数据库,则会报错;若加上这段代码且存在该数据库。则不会报错。           已知已经存在 db01 这个数据库了,通过 create database db01; 再来创建时,会报错。如果加上 if not exists ,那么及时创建相同的数据库也不会报错,当然也不可能创建一个一摸一样的数据库。          2.1.2 查看数据库操作 查看全部数据库的 SQL 语句:   show databases;         需要注意的是,这里的 databases 记得加上 s 且该后面结尾加上 ";" 。   查看的结果为:           在红色框里面的数据库是 MySQL 自带的数据库,万万不可对这四个数据库进行任何危险操作。否则 MySQL 出现问题,需要重新安装了。          除了这个查看全部数据库操作之外,还有查看当前使用数据库操作。   查看当前数据库的 SQL 语句:  select database();         这里的 database 是没有加上 s 的且注意是加上 () 。  操作结果为:           当前使用的数据库为 db01 。          2.1.3 使用数据库操作 使用数据库的 SQL 语句:  use 数据库名;         简单来说,就是选择指点的数据库。  操作结果为:           2.1.4 删除数据库操作 删除数据库的 SQL 语句:  drop database if exists 数据库名;         若存在该数据库,删除不会报错;如果没有加上 if exists 这段代码,那么当不存在该数据库而要删除该数据库时,会报错。  操作结果为:           删除该数据库后,查看全部数据时,不存在 db01 这个库了。显然是删除成功了。          2.2 DDL 语言 - 定义表格         在对表进行操作之前,需要先选择数据库。DDL 来定义表格的操作有:创建表格、查询表格、修改表格、删除表格。          2.2.1 创建表格操作         1)在创建表格之前,先来简单了解约束          约束概念:约束是作用与表中字段上的规则,用于限制存储在表中的数据。          约束目的:保证数据中数据的正确性、有效性和完整性。  约束类型如下:           2)在创建表格之前,再来简单了解数据类型          数据类型可以简单理解为,该字段需要存储空间的大小。总共分为三大类:数值类型、字符串类型、日期时间类型。  数值类型如图:    字符串常见类型如图:           两者区别:举例子 char(10) 与 varchar(10) ,对于 char(10) 来说,不管空间是否占满,都要消耗 10 个字节大小的空间。而对于 varchar(10) 来说,若空间没有占满 10 个字节大小,就会按照消耗实际存储空间大小。  日期时间类型如图:   3)创建表格的 SQL 语句:  create table 表名(     字段 1 字段类型 [约束] [ comment 字段1注释 ],       ......          字段 n 字段类型 [约束] [ comment 字段n注释]  ) [comment 表注释]; 实际例子演示:   create table tb_user(     id tinyint unsigned auto_increment primary key comment '唯一标识',     username varchar(20) not null unique comment '用户名',     name varchar(20) not null comment '名字',     age tinyint unsigned comment '年龄',     gender char(1) default '男' comment '性别,默认为男性' )comment '用户表'; 操作结果为:           这就可以得到一个表格。之后就可以在表格中添加数据了。          2.2.2 查询表格操作 查询当前该数据库中的全部表的 SQL 语句:  -- 查看表 show tables; 操作结果为:   查询该表的结构的 SQL 语句:  -- 查看表的结构 desc 表名; 操作结果为:           注意查询两者的区别:一个是查询所有的表、另一个是查询指定表的结构。          2.2.3 删除表格操作 删除表格的 SQL 语句为:  -- 删除表 drop table 表名;         2.2.4 修改表格操作 1)添加字段的 SQL 语句:  alter table 表名 add 字段名 类型 [约束];  2)修改字段类型的 SQL 语句:  alter table 表名 modify 字段名 新数据类型; 3)修改字段名和字段类型的 SQL 语句:  alter table 表名 change 旧字段名 新字段名 类型 [约束]; 4)删除字段的 SQL 语句:  alter table 表名 drop column 字段名; 5)修改表名的 SQL 语句:  rename table 旧表名 to 新表名;  结合以上操作举个修改例子:  -- 增加表中的列 alter table tb_user add qq char(10) comment 'QQ号';   -- 修改字段类型 alter table tb_user modify qq char(22);   -- 修改字段名和字段类型 alter table tb_user change qq qq_name char(20);   -- 删除表中的指定的字段 alter table tb_user drop column qq_name;   -- 修改表中的名字 rename table tb_user to tb_user2; rename table tb_user2 to tb_user; ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/Tingfeng__/article/details/136288617 
  • [技术干货] SQL Server 事务日志文件过大 解决方案-转载
     事务日志文件(Transaction Log File)是用来记录数据库更新情况的文件,扩展名为ldf。当出现以下情况时,就会报“事务日志已满”的错误:  日志文件没有设置了自动增长,当记录超过初始大小;  日志文件设置了自动增长,“最大文件大小”设置了具体的大小(如2000M),当文件达到设置的大小时。  解决SQL Server数据库事务日志已满的方法 要解决事务日志已满的问题,可以采用以下三种方法,截断日志、收缩日志文件以及修改数据库恢复模式.  修改数据库恢复模式 将数据库恢复模式从“完整模式”或“大容量日志恢复模式”更改为“简单模式”可以解决SQL Server数据库事务日志已满问题。但是,请注意这种方法可能会导致数据丢失。以下是修改数据库恢复模式的步骤:  1. 在 SQL Server Management Studio 中,右键单击数据库,选择“属性”。   2. 在“选项”中,将“恢复模式”设置为“简单”,然后点击“确定”   3. 在 SQL Server Management Studio 中,右键单击数据库,选择“任务”->“备份”。   4. 在“备份类型”中,选择“日志”,点击“确定”。   截断日志 截断日志是解决SQL Server数据库事务日志已满问题的较简单方法。通过截断日志,可以清除日志文件中的旧数据,从而释放空间。  在对象资源管理器中,连接到 SQL Server 数据库引擎的实例,然后展开该实例。 展开“数据库”,再右键单击要截断日志的数据库。 指向“任务”,指向“收缩”,然后选择“文件”。 选择文件的文件类型。可用的选项包括“数据”和“日志”文件。默认选项为“数据”。 在与以上所选的“文件类型”相关联的文件组列表中选择文件组。 从所选文件组和文件类型的可用文件列表中选择文件。 选中“释放未使用的空间”选项,将为操作系统释放文件中所有未用空间,并尝试将行重新定位到未分配页。 根据需要,输入在收缩数据库后数据库文件中要保留的最大可用空间百分比。值可以介于 0 和 99 之间。 请注意,在收缩日志文件之前,需要将数据库的恢复模式更改为简单模式。此外,收缩日志文件的步骤与截断日志文件的步骤类似,但是收缩日志文件会将日志文件的大小缩小到指定的大小,而截断日志文件只是删除不活动的虚拟日志文件以释放空间。  总之,使用 SQL Server Management Studio 截断日志的方法包括连接到 SQL Server 数据库引擎的实例,展开“数据库”,右键单击要截断日志的数据库,指向“任务”,指向“收缩”,然后选择“文件”。请注意,在执行截断操作之前,应该备份数据库以防止数据丢失。  收缩日志文件 收缩日志文件是另一种解决SQL Server数据库事务日志已满问题的方法。通过收缩日志文件,可以压缩日志文件的大小,从而释放空间。  在 SQL Server 中,可以使用 SQL Server Management Studio 或 Transact-SQL 来收缩数据或日志文件。以下是使用 SQL Server Management Studio 收缩日志文件的步骤:  在对象资源管理器中,连接到 SQL Server 数据库引擎的实例,然后展开该实例。  展开“数据库”,再右键单击要收缩的数据库。  指向“任务”,指向“收缩”,然后选择“文件”。   选择文件的文件类型。可用的选项包括“数据”和“日志”文件。默认选项为“数据”。  在与以上所选的“文件类型”相关联的文件组列表中选择文件组。  从所选文件组和文件类型的可用文件列表中选择文件。  选中“释放未使用的空间”选项,将为操作系统释放文件中所有未用空间,并尝试将行重新定位到未分配页。  根据需要,输入在收缩数据库后数据库文件中要保留的最大可用空间百分比。值可以介于 0 和 99 之间。  请注意,收缩日志文件的步骤与收缩数据文件的步骤略有不同。在收缩日志文件之前,需要将数据库的恢复模式更改为简单模式。以下是使用 Transact-SQL 收缩日志文件的步骤:  将数据库的恢复模式更改为简单模式。 截断事务日志。 收缩日志文件。 具体的 Transact-SQL 命令如下:  -- 将数据库的恢复模式更改为简单模式 ALTER DATABASE database_name SET RECOVERY SIMPLE; -- 截断事务日志 BACKUP LOG database_name WITH TRUNCATE_ONLY; -- 收缩日志文件 DBCC SHRINKFILE (file_name, target_size);                      其中,file_name 是要收缩的日志文件的逻辑名称,target_size 是要收缩到的目标大小。  总之,收缩日志文件的步骤包括将数据库的恢复模式更改为简单模式、截断事务日志、收缩日志文件。请注意,在执行收缩操作之前,应该备份数据库以防止数据丢失。  使用傲梅企业备份网络版软件备份 SQL Server 数据库并解决事务日志已满问题 如果您的 SQL Server 数据库事务日志已满,并且您正在使用 SSMS 解决该问题,您也可以考虑使用傲梅企业备份网络版软件来备份数据库。傲梅企业备份网络版提供了以下功能:  ◉ 提供系统/磁盘/分区/文件备份,助您创建集中备份对于 LAN 内的所有客户端。它还提供 SQL Server 备份,用于在一台 PC/服务器上备份多个实例。 ◉ 它使您能够使用计划功能创建自动备份任务。有四种可用的计划模式:一次、每日、每周和每月。 ◉ 支持SQL Server 2019/2017/2016/2014/2012/2008(R2)/2005数据库备份。 ◉ 它可以安装在Windows Server(Windows Server 2019/2016/2012/2011/2008/2003等)和Windows PC(Windows 10/8.1/8/7/Vista/XP)上。  使用傲梅企业备份网络版软件备份 SQL Server 数据库可以帮助您解决事务日志已满的问题。下面是使用傲梅企业备份网络版备份 SQL Server 数据库的步骤:  1. 在局域网内的其中一台计算机上安装傲梅企业备份网络版作为中央管理计算机。  2.安装客户端程序  启动傲梅企业备份网络版 并转到 "计算机"  >  "未控制的计算机"  >  "安装客户端"。您将看到如下两个选项:  客户端手动安装:点击“下一步”即可得到客户端程序安装文件。将安装文件复制到装有 SQL Server 的计算机上,并以管理员身份运行它以安装傲梅企业备份网络版 Agent。  远程客户端安装:点击“下一步”,您将拥有局域网内所有可用的计算机。选择装有SQL Server 的计算机,输入它的用户名和密码,然后单击“安装”。   3.请求控制  3.1. 如果您手动安装了客户端程序,客户端计算机将列在 "计算机"  >  “未控制的计算机”下。勾选装有SQL Server的电脑,点击 “请求控制” 获取控制权限。 提供了两种方法:  输入账号:输入客户端的用户名和密码,点击“确定”。  通过发送消息:程序将向客户端计算机发送消息。在客户端计算机上单击“同意”以授权访问。   3.2. 如果您远程安装了客户端程序,客户端计算机将列在 "计算机"  >  “已控制的计算机”下。在这种情况下,您无需请求控制权。  现在您可以通过 傲梅企业备份网络版每天执行SQL Server自动备份,步骤如下:  1. 转到 “任务” 选项卡,单击 “新建任务” 并选择 “SQL Server 备份”。   2. 在弹出窗口中,根据需要编辑任务名称。然后, 在“第一步”栏中点击 “添加计算机” ,选择带有SQL Server数据库的受控计算机。    3. 单击“步骤 2”列,然后单击“添加”。该程序将检测计算机上的所有 SQL Server 实例。选择要备份的实例和数据库,然后单击“确定”。   4. 单击“第 3 步”列,然后单击“添加存储”。键入网络共享或 NAS 路径以添加目标位置以存储备份文件。   5. 单击左下角的“计划并选择您要为其创建计划的计算机”。在“日程设置”窗口的下拉列表中选择“每天” ,完成相应的设置。您还可以通过单击“高级”选择运行完整/差异备份。   6. 确认操作,点击 “开始备份”。您可以在此处选择“仅创建任务”或“创建并执行任务”。   结论 以上是解决 SQL Server数据库事务日志已满问题的多种方法。截断日志和收缩日志文件是较为简单的方法,但可能会导致数据丢失。修改数据库恢复模式可以解决问题,但也可能会导致数据丢失。使用傲梅企业备份网络版软件备份 SQL Server 数据库是最安全的方法,可以保证数据的完整性。 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/qq_41497074/article/details/131675312 
  • [技术干货] 【MySQL】学习多表查询和笛卡尔积-转载
     多表查询 指的是从多张表中查询数据  首先准备好需要查询的数据表 - dept表 和 emp表 -- 准备数据 create table dept(     id int auto_increment comment 'ID' primary key ,     name varchar(50) not null comment '部门名称' )comment '部门表'; insert into  dept(id, name) VALUES (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办'),(6,'人事部');  create table emp(     id int auto_increment comment 'ID' primary key ,     name varchar(50) not null comment '姓名',     age int comment '年龄',     job varchar(20) comment '职位',     salary int comment '薪资',     entrydate date comment '入职时间',     managerid int comment '直属领导ID',     dept_id int comment '部门ID' )comment '员工表';  insert into emp (id, name, age, job, salary, entrydate, managerid, dept_id) VALUES                 (1,'金庸',66,'总裁',2000,'2000-01-01',null,5),(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),                 (3,'杨逍',33,'开发',8400,'2000-11-03',2,1),(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),                 (5,'常遇春',43,'开发',10500,'2004-09-07',3,1),(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1),                 (7,'灭绝',60,'财务总监',8500,'2002-09-12',1,3),(8,'周芷若',19,'会计',48000,'2006-06-02',7,3),                 (9,'丁敏君',23,'出纳',5250,'2009-05-13',7,3),(10,'赵敏',20,'市场部总监',12500,'2004-10-12',1,2),                 (11,'鹿杖客',56,'职员',3750,'2006-10-03',10,2),(12,'鹤笔翁',19,'职员',3750,'2007-05-09',10,2),                 (13,'方东白',19,'职员',5500,'2009-02-12',10,2),(14,'张三丰',88,'销售总监',14000,'2004-10-12',14,4),                 (15,'俞莲舟',38,'销售',4600,'2004-10-12',14,4),(16,'宋远桥',40,'销售',4600,'2004-10-12',14,4),                 (17,'陈友谅',42,null,2000,'2011-10-12',1,null);  -- 添加外键将两张表进行关联 alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id); -- 多表查询 - 笛卡尔积 select * from emp , dept ; 笛卡尔积:笛卡尔乘积是指在数学中,两个集合 A 集合和 B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)—>17*6 = 102 所以我们可以看到102条记录  如何消除无效的笛卡尔积? 我们可以通过emp表中的外键和dept的id建立连接,我们只需要在原来基础上加上条件即可 -- 多表查询 - 通过where添加条件,消除无效的笛卡尔积 select * from emp , dept where emp.dept_id = dept.id ; 通过控制台运行结果我们可以发现我们明明有17个员工而查询到的结果只有16条,这是为什么呢? 这是因为我们的陈友谅这个员工是刚来的员工还没有给他分配部门。👇  多表查询分类 连接查询 内连接: 相当于查询A、B交集部分数据 外连接: 左外连接:查询 左表 所有数据,以及两张表交集部分数据 右外连接:查询 右表 所有数据,以及两张表交集部分数据 自连接: 当前表与自身的连接查询,自连接必须使用表别名。 字查询                          原文链接:https://blog.csdn.net/Aileenvov/article/details/136153617 
  • 项目开发中常用乱码解决手段分享
    在做项目的过程中,遇到了中文乱码问题,该如何处理?(比如网站主页查询页面显示乱码)可以从页面,程序,以及数据库三个方面去查看问题的原因所在,主页面显示中文乱码,无外乎是因为从数据库中取出来的数据传输到主页面的过程中出现了编码问题,那么就应该从这三个方面去查找问题的所在。因为我们常用UTF-8的编码格式,所以我们就检查所有数据的编码是否都是UTF-8编码。1.  查看一下页面jsp文件的编码格式(1.3.1/1.3.2)1.1、项目文本文件默认编码:【右击项目】->【Properties】->【Resource】->【Text file encoding】1.2、文件默认编码:默认使用项目的默认编码【右击文件】->【Properties】->【Resource】->【Text file encoding】1.3、JSP文件编码:由于JSP要翻译为Servlet1.3.1、JSP文件编码:【右击文件】->【Properties】->【Resource】->【Text file encoding】1.3.2、JSP翻译为Servlet时的编码: (此项可以由1.1,1.2,1.3.1代替)<%@ page language="java" pageEncoding="utf-8"%>1.3.3、从服务器将jsp内容输出到浏览器<%@page contentType="text/html;charset=utf-8"%>在这次输出过程中,由contentType属性中的charset来指定,将servlet编译后的的二进制码以charset的编码形式来输出。2.  服务器端编码设置服务器端编码,将客户端传过来的数据进行解码:浏览器默认使用ISO-8859-1进行编码数据,然后将数据传输到服务器,因此我们默认只需要将浏览器发送过来的数据转换为我们需要的编码即可。GET请求方式:2.1 TOMCAT默认ISO-8859-1 因此可以设置默认编码为UTF-8解决,在conf\server.xml文件中设置如下<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding=”UTF-8”/>2.2String username = request.getParameter(“username”);username = new String(username.getBytes("ISO-8859-1“), "UTF-8"); POST请求方式:2.3 // 必须在获取参数之前,调用如下方法先解码request.setCharacterEncoding(“UTF-8”);String username = request.getParameter(“username”);response.setContentType("text/html;charset=utf-8");3.数据库的编码设置  3.1 JDBC连接数据库的编码设置    "jdbc:mysql://localhost:3306/jd1203db?useUnicode=true&characterEncoding=utf8","root","1234");  3.2 在建表或者建数据库时可以加上:    create database jsd1203db ENGINE=InnoDB DEFAULT CHARSET=utf8; 3.3查看MySql数据中当前联接系统参数  show variables like 'char%',显示各个编码类型。    可以show create database dangdang;通过该语句查看建库的语句,看是否有设置编码。   如果各种编码都是对的,可是在数据库中查看数据时是乱码,可以用set names ‘gbk’,设置查看编码为gbk,与系统一致(windows)。 注意,这个设置只对当前会话有效。
  • [技术干货] 浅谈为什么现在大多数公司都转向pgsql,而非原来的mysql
    现在大部分应用选择使用 PostgreSQL(常称为 pgsql)而不是 MySQL 的原因有多个,这些原因可能因具体的应用场景、技术要求和团队偏好而异。以下是一些可能的原因:功能特性:扩展性:PostgreSQL 支持更多的数据类型、函数和操作符,允许开发者构建更复杂的应用。事务处理:PostgreSQL 支持更复杂的 ACID 事务模型,对于需要高度一致性和可靠性的应用来说是一个优势。JSON 支持:PostgreSQL 提供了对 JSON 数据的原生支持,这对于存储和查询 JSON 格式的数据非常方便。性能:查询性能:在某些复杂查询和大数据量的情况下,PostgreSQL 可能提供比 MySQL 更好的性能。并行查询:PostgreSQL 支持并行查询,这有助于加速大数据集的处理。标准和兼容性:SQL 标准:PostgreSQL 更接近于 SQL 标准,这有助于跨数据库系统的兼容性。开源社区:虽然 MySQL 也有庞大的开源社区,但 PostgreSQL 社区在某些方面可能更活跃,这有助于解决技术问题。可靠性:数据完整性:PostgreSQL 提供了更强大的数据完整性检查和恢复功能。故障恢复:PostgreSQL 的故障恢复机制也被认为比 MySQL 更健壮。安全性:加密和身份验证:PostgreSQL 提供了更强大的加密和身份验证功能,有助于保护数据安全。行级安全性:PostgreSQL 支持行级安全性,允许开发者更精细地控制数据的访问权限。其他:复制和集群:PostgreSQL 提供了强大的复制和集群功能,有助于构建高可用性和可扩展性的应用。历史和技术债务:某些团队可能因历史项目或技术债务而选择 PostgreSQL,而不是 MySQL。需要注意的是,选择数据库系统是一个复杂的过程,需要考虑多种因素,如技术需求、团队经验、社区支持、成本等。因此,并没有一个“一刀切”的答案,每个项目都应该根据具体情况进行评估和选择。
  • [其他] group by 为什么比 distinct 效率高
    在数据库操作中,我们常常遇到需要将数据去重计数的工作。例如:表A,列colACABCDAB结果就是一共出现4个不同的字母A、B、C、D即结果为4大体上我们可以选择count(distinct col)的方法和group+count的方法。分别为:select count(distinct col) from A;select count(1) from (select 1 from A group by col) alias;两中方法实现有什么不同呢?其实上述两中方法分别是在运算和存储上的权衡。distinct需要将col列中的全部内容都存储在一个内存中,可以理解为一个hash结构,key为col的值,最后计算hash结构中有多少个key即可得到结果。很明显,需要将所有不同的值都存起来。内存消耗可能较大。而group by的方式是先将col排序。而数据库中的group一般使用sort的方法,即数据库会先对col进行排序。而排序的基本理论是,时间复杂为nlogn,空间为1.,然后只要单纯的计数就可以了。优点是空间复杂度小,缺点是要进行一次排序,执行时间会较长。两中方法各有优劣,在使用的时候,我们需要根据实际情况进行取舍。具体情况可参考如下法则数据分布去重方式原因离散groupdistinct空间占用较大,在时间复杂度允许的情况下,group 可以发挥空间复杂度优势集中distinctdistinct空间占用较小,可以发挥时间复杂度优势两个极端:1.数据列的所有数据都一样,即去重计数的结果为1时,用distinct最佳2.如果数据列唯一,没有相同数值,用group 最好当然,在group by时,某些数据库产品会根据数据列的情况智能地选择是使用排序去重还是hash去重,例如postgresql。当然,我们可以根据实际情况对执行计划进行人工的干预,而这不是这里要讨论的话题了。原文:https://blog.csdn.net/qq_40026782/article/details/83416317?spm=1001.2014.3001.5502
  • [其他] 深入理解 MySQL 底层实现
     一、MySQL 的常用引擎 1. InnoDB InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件。  InnoDB 中存在表锁和行锁,不过行锁是在命中索引的情况下才会起作用。  InnoDB 支持事务,且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读;而在 Oracle 数据库中,只支持串行化级别和读已提交这两种级别,其中默认的为读已提交级别。  2. Myisam Myisam 的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中 .frm 是表的定义文件,.MYD 是数据文件,.MYI 是索引文件。  Myisam 只支持表锁,且不支持事务。Myisam 由于有单独的索引文件,在读取数据方面的性能很高 。  3. 存储结构 InnoDB 和 Myisam 都是用 B+Tree 来存储数据的。  二、MySQL 的数据、索引存储结构 1. 数据存储的原理(硬盘) 信息存储在硬盘里,硬盘是由很多的盘片组成,通过盘片表面的磁性物质来存储数据。  把盘片放在显微镜下放大,可以看到盘片表面是凹凸不平的,凸起的地方被磁化,代表数字 1,凹的地方没有被磁化,代表数字 0,因此硬盘可以通过二进制的形式来存储表示文字、图片等的信息。  硬盘有很多种,但是都是由盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部分组成。  所有的盘片都固定在一个旋转轴上,这个轴即盘片主轴。  所有的盘片之间是绝对平行的,在每个盘片的盘面上都有一个磁头,磁头与盘片之间的距离比头发丝的直径还小。  所有的磁头连在一个磁头控制器上,由磁头控制器负责各个磁头的运动,磁头可沿盘片的半径方向移动,实际上是斜切运动,每个磁头同一时刻必须是同轴的,即从正上方往下看,所有磁头任何时候都是重叠的。  由于技术的发展,目前已经有多磁头独立技术了,在此不考虑此种情况。  盘片以每分钟数千转到上万转的速度在高速运转,这样磁头就能对盘片上的指定位置进行数据的读写操作。  由于硬盘是高精密设备,尘埃是其大敌,所以必须完全密封。  2. 数据读写的原理 硬盘在逻辑上被划分为磁道、柱面以及扇区。  磁头靠近主轴接触的表面,即线速度最小的地方,是一个特殊的区域,它不存放任何数据,称为启停区或者着陆区,启停区外就是数据区。  在最外圈,离主轴最远的地方是 “0” 磁道,硬盘数据的存放就是从最外圈开始的。  在硬盘中还有一个叫 “0” 磁道检测器的构件,它是用来完成硬盘的初始定位。  盘面  硬盘的盘片一般用铝合金材料做基片,硬盘的每一个盘片都有上下两个盘面,一般每个盘面都会得到利用,都可以存储数据,成为有效盘面,也有极个别的硬盘盘面数为单数。  每一个这样的有效盘面都有一个盘面号,按顺序从上至下从 0 开始编号。  在硬盘系统中,盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头,硬盘的盘片组在 2-14 片不等,通常有 2-3 个盘片。  磁道  磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道。  磁道从外向内从 0 开始顺序编号,硬盘的每一个盘面有 300-1024 个磁道,新式大容量硬盘每面的磁道数更多,信息以脉冲串的形式记录在这些轨迹中,这些同心圆不是连续记录数据,而是被划分成一段段的圆弧。  这些圆弧的角速度一样,由于径向长度不一样,所以线速度也不一样,外圈的线速度较内圈的线速度大,即同样的转速度下,外圈在同样时间段里,划过的圆弧长度要比内圈划过的圆弧长度大。  每段圆弧叫做一个扇区,扇区从 1 开始编号,每个扇区中的数据作为一个单元同时读出或写入。  磁道是看不见的,只是盘面上以特殊形式磁化了的一些磁化区,在磁盘格式化时就已规划完毕。  柱面  所有盘面上的同一磁道构成一个圆柱,通常称作柱面。  每个圆柱上的磁头由上而下从 0 开始编号,数据的读 / 写按柱面进行,即磁头读 / 写数据时首先在同一柱面内从 0 磁头开始进行操作,依次向下在同一柱面的不同盘面即磁头上进行操作。  只有在同一柱面所有的磁头全部读 / 写完毕后磁头才转移到下一柱面(同心圆再往里的柱面),因为选取磁头只需要通过电子切换即可,而选取柱面则必须机械切换,电子切换相当快,比在机械上的磁头向邻近磁道移动快得多。  所以,数据的读 / 写按柱面进行,而不按盘面进行,也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面来写,一个柱面写满后,才移到下一个扇区开始写数据,读数据也按照这种方式进行,这样就提高了硬盘的读 / 写效率。  扇区  操作系统以扇区形式将信息存储在硬盘上,每个扇区包括 512 个字节的数据和一些其他信息,一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。  标识符就是扇区头标,包括组成扇区三维地址的三个数字:盘面号,柱面号,扇区号(块号)。  数据段可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用 512 个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的 ECC 数字填入这个部分。  可以查看一个图《扇区、磁道、盘面 (原理理解篇)》理解  3. 访盘请求完成过程 1)确定磁盘地址(柱面号,磁头号,扇区号),内存地址(源 / 目):  当需要从磁盘读取数据的时候,系统会将数据的逻辑地址传递个磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。  2)为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点:  A. 首先必须找到柱面,即磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间。  B. 然后目标扇区旋转到磁头下,即磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。  3)即一次访盘请求(读 / 写)完成过程由三个动作组成:  A. 寻道(时间):磁头移动定位到指定磁道。  B. 旋转延迟(时间):等待指定扇区从磁头下旋转经过。  C. 数据传输(时间):数据在磁盘与内存之间的实际传输。  4. 磁盘的读写原理 系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第 1 磁道的第一磁头下的所有扇区,然后是同一柱面的下一个磁头……  一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。  系统也以相同的顺序读出数据,读出数据时通过告诉磁盘控制器要读出扇区所在柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。  5. 减少 I/O 的预读原理 由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费的时间,磁盘的存取速度往往是主存的几百分之一。  因此,为了提高效率,要尽量减少磁盘的 I/O。  磁盘往往不是严格地按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。  这样做的理论依据是计算机科学中著名的局部性原理:  当一个数据被用到时,其附近的数据一般来说也会被马上使用。  程序运行期间所需要的数据通常比较集中。  由于磁盘顺序读取的效率很高(不需要寻道时间,只需要很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高 I/O 效率。  预读的长度一般为页(Page)的整数倍。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储分割为连续的大小相等的块。  每个存储块称为一页(在许多操作系统中,页的大小通常为 4k),主存和磁盘以页为单位交换数据,当程序要读取的数据不在主存中时,会触发一个缺页异常。  此时系统会向磁盘发出读盘信息,磁盘会找到数据的起始位置并向后连续读取一页或几页的数据载入内存中,然后异常返回,程序继续运行。  6. MySQL 的索引 索引是一种用来实现 MySQL 高效获取数据的数据结构。  我们通常所说的在某个字段上建索引,意思就是让 MySQL 对该字段以索引这种数据结构来存储,然后查找的时候就有对应的查找算法。  建索引的根本目的是为了查找的优化,特别是当数据很庞大的时候,一般的查找算法有顺序查找、折半查找、快速查找等。  但是每种查找算法都只能应用于特定的数据结构之上,例如顺序查找依赖于顺序结构,折半查找通过二叉查找树或红黑树实现二分搜索。因此在数据之外,数据库系统还维护着满足特定查找算法的数据结构。  这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。  7. MySQL 的 B+Tree 目前大多数数据库系统及文件系统都采用 B-Tree 或其变种 B+Tree 作为索引结构。  B+ 树索引是 B+ 树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+ 树中的 B 代表平衡,而不是二叉。  因为 B+ 树是从最早的平衡二叉树演化而来的。B+ 树是由二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree)逐步优化而来。  二叉查找树:左子树的键值小于根的键值,右子树的键值大于根的键值。  AVL 树:平衡二叉树(AVL 树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为 1。  平衡多路查找树(B-Tree):为磁盘等外存储设备设计的一种平衡查找树。  系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一磁盘块中的数据会被一次性读取出来,而不是按需读取。  InnoDB 存储引擎使用页作为数据读取单位,页是其磁盘管理的最小单位,默认 page 大小是 16k。  系统的一个磁盘块的存储空间往往没有这么大,因此 InnoDB 每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小 16KB。  InnDB 在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能助于定位数据记录的位置,这将会减少磁盘 I/O 的次数,提高查询效率。  B-Tree 结构的数据可以让系统高效的找到数据所在的磁盘块。  为了描述 B-Tree,首先定义一条数据记录为一个二元组 [key, data],key 为记录的键值,对于不同数据记录,key 是互不相同的;data 为数据记录除 key 外的数据。  那么 B-Tree 是满足下列条件的数据结构:  d 为大于 1 的一个正整数,称为 B-Tree 的度。  h 为一个正整数,称为 B-Tree 的高度。  每个非叶子节点由 n-1 个 key 和 n 个指针组成,其中 d<=n<=2d。  每个叶子节点最少包含一个 key 和两个指针,最多包含 2d-1 个 key 和 2d 个指针,叶节点的指针均为 null 。  所有叶节点具有相同的深度,等于树高 h。  key 和指针互相间隔,节点两端是指针。  一个节点中的 key 从左到右非递减排列。  所有节点组成树结构。  每个指针要么为 null,要么指向另外一个节点。  如果某个指针在节点 node 最左边且不为 null,则其指向节点的所有 key 小于 v(key1),其中 v(key1) 为 node 的第一个 key 的值。  如果某个指针在节点 node 最右边且不为 null,则其指向节点的所有 key 大于 v(keym),其中 v(keym) 为 node 的最后一个 key 的值。  如果某个指针在节点 node 的左右相邻 key 分别是 keyi 和 keyi+1 且不为 null,则其指向节点的所有 key 小于 v(keyi+1) 且大于 v(keyi)。  B-Tree 中的每个节点根据实际情况可以包含大量的关键字信息和分支,例:    每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。  两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。  以根节点为例,关键字为 17 和 35,P1 指针指向的子树的数据范围为小于 17,P2 指针指向的子树的数据范围为 17~35,P3 指针指向的子树的数据范围为大于 35。  模拟查找关键字 29 的过程:  根据根节点找到磁盘块 1,读入内存。【磁盘 I/O 操作第 1 次】  比较关键字 29 在区间(17,35),找到磁盘块 1 的指针 P2。  根据 P2 指针找到磁盘块 3,读入内存。【磁盘 I/O 操作第 2 次】  比较关键字 29 在区间(26,30),找到磁盘块 3 的指针 P2。  根据 P2 指针找到磁盘块 8,读入内存。【磁盘 I/O 操作第 3 次】  在磁盘块 8 中的关键字列表中找到关键字 29。   MySQL 的 InnoDB 存储引擎在设计时是将根节点常驻内存的,因此力求达到树的深度不超过 3,也就是说 I/O 不需要超过 3 次。  分析上面过程,发现需要 3 次磁盘 I/O 操作,和 3 次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。  而 3 次磁盘 I/O 操作是影响整个 B-Tree 查找效率的决定因素。  B-Tree 相对于 AVLTree 缩减了节点个数,使每次磁盘 I/O 取到内存的数据都发挥了作用,从而提高了查询效率。  B+Tree 是在 B-Tree 基础上的一种优化,使其更适合实现外存储索引结构,InnoDB 存储引擎就是用 B+Tree 实现其索引结构。  在 B-Tree 中,每个节点中有 key,也有 data,而每一个页的存储空间是有限的,如果 data 数据较大时将会导致每个节点(即一个页)能存储的 key 的数量很小。  当存储的数据量很大时同样会导致 B-Tree 的深度较大,增大查询时的磁盘 I/O 次数,进而影响查询效率。  在 B+Tree 中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储 key 值信息,这样可以大大加大每个节点存储的 key 值数量,降低 B+Tree 的高度。  B+Tree 在 B-Tree 的基础上有两点变化:  数据是存在叶子节点中的;  数据节点之间是有指针指向的。   由于 B+Tree 的非叶子节点只存储键值信息,假设每个磁盘块能存储 4 个键值及指针信息,则变成 B+Tree 后其结构如下图所示:    通常在 B+Tree 上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。  因此可以对 B+Tree 进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。  8. Myisam 中的 B+Tree Myisam 引擎也是采用的 B+Tree 结构来作为索引结构。  由于 Myisam 中的索引和数据分别存放在不同的文件,所以在索引树中的叶子节点中存的数据是该索引对应的数据记录的地址,由于数据与索引不在一起,所以 Myisam 是非聚簇索引。    9. InnoDB 中的 B+Tree InnoDB 是以 ID 为索引的数据存储。  采用 InnoDB 引擎的数据存储文件有两个,一个定义文件,一个是数据文件。  InnoDB 通过 B+Tree 结构对 ID 建索引,然后在叶子节点中存储记录。    若建索引的字段不是主键 ID,则对该字段建索引,然后在叶子节点中存储的是该记录的主键,然后通过主键索引找到对应的记录。  三、MySQL 的相关优化 1. MySQL 性能优化:组成、表的设计 开启查询缓存。避免某些 SQL 函数直接在 SQL 语句中使用,从而导致 Mysql 缓存失效。  避免画蛇添足。目的是什么就取什么,例如某个逻辑是只需要判断是否存在女性,若是查到了一条即可,勿要全部都查一遍,此时要善用 limit。  建合适的索引。所以要建在合适的地方,合适的对象上。经常操作 / 比较 / 判断的字段应该建索引。  字段大小合宜。字段的取值是有限而且是固定的,这种情况下可以用 enum,IP 字段可以用 unsigned int 来存储。  表的设计。垂直分割表,使得固定表与变长表分割,从而降低表的复杂度和字段的数目。  2. SQL 语句优化:避免全表扫描 建索引:一般在 where 及 order by 中涉及到的列上建索引,尽量不要对可以重复的字段建索引。  尽量避免在 where 中使用 !(<>)或 or,也不要进行 null 值判断。  尽量避免在 where 中对字段进行函数操作、表达式操作。  尽量避免使用 like- %,在此种情况下可以进行全文检索。  原文:https://blog.csdn.net/qq_40026782/article/details/96429076?spm=1001.2014.3001.5502 
  • [其他] Mybatis+mysql批量插入性能分析测试
     环境说明 项目使用springboot mybatis 数据库mysql5.7 使用本地mysql所以网络可以忽略不计 插入对象完全相同,只有id自增  表结构如下: CREATE TABLE order_test_tab ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', order_id varchar(20) NOT NULL COMMENT '订单号', order_name varchar(100) NOT NULL COMMENT '订单名称', order_status int(1) NOT NULL COMMENT '订单状态', order_content varchar(255) NOT NULL COMMENT '订单说明', add_time datetime NOT NULL COMMENT '订单时间', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试订单表';    方法说明 我使用了和文章中提到的一样,三种方法进行测试  方法一: 使用for循环调用单条插入    方法二: 在sql中使用foreach进行批量insert   方法三: 使用mybatis的批量插入     结果说明 插入条数    100    500    1000    5000    100000 使用for循环插入    139ms    545ms    839ms    2629ms    31157ms 使用sql foreach插入    55ms    119ms    123ms    329ms    报错 使用批量执行插入    48ms    111ms    239ms    1081ms    19235ms 其中报错是因为sql长度过长超过了max_allowed_packet导致的,报错信息如下: Error updating database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (22,700,108 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.  从结果我们显然可以看出,使用第二种方式(使用sql foreach插入)效率最高,明显与文章中差距很大,所以mysql和sqlserver还是有很大区别的,估计mysql针对批量插入的语句有过优化    测试说明 1.测试具体插入之前,首先执行删除表中所有数据操作,一个是保证环境完全一致,一个是为了减少第一次连接数据库所带来的性能消耗。 2.执行时间的计算就是在执行sql的前后,创建对象的时间不计算在这之内 3.在使用本地mysql测试完成之后,使用外网服务器的mysql进行测试,测试结果基本一致,时间都略有延长  4.测试代码在:https://github.com/LinkinStars/springBootTemplate/tree/test-batch-insert 其中包含order字样的为测试相关代码,别的是无关代码,入口在test包下的OrderTest.java    结论 批量插入时还是使用sql foreach插入来的效率最高,因为它是整一条sql在执行所以当插入条数很多的时候会出现异常,所以使用这种方式时一定要主动限制插入的最大条数,不然容易出现异常,因为max_allowed_packet即使再大也会有不够用的时候。 同时我们也应该竟可能去避免使用for循环插入数据,因为性能真的很差   原文https://blog.csdn.net/qq_40026782/article/details/98057116?spm=1001.2014.3001.5502 
  • [其他] mysql 间隙锁
     环境:mysql5.6  innodb存储引擎,默认隔离级别repeatable-read,可重复读。innodb_locks_unsafe_for_binlog, 参数默认值是OFF,也就是启用间隙锁, 他是一个bool值, 当值为true时表示disable间隙锁  知识:与oracle不同的是,mysql加锁是对索引加锁  在进行删除或者修改操作时,如果过滤条件列是非唯一索引,为了保证当前读的数据一致性,mysql通过间隙锁对数据之间区域进行锁定。(实际上是通过锁定索引达到效果)  这种锁叫间隙锁,这种锁定会造成许多误杀,很多并不冲突的数据会因为间隙锁而无法插入。     举例:  准备测试数据  create table test (id int,name varchar(10)); alter table test add primary key PK_ID (id); alter table test add index INX_Name (name); insert into test values (1,'a1'); insert into test values (2,'a1'); insert into test values (3,'a1'); insert into test values (4,'a3'); insert into test values (5,'a4'); insert into test values (11,'a6'); insert into test values (21,'a10'); insert into test values (22,'a13'); insert into test values (23,'a14'); insert into test values (24,'a15');  session one;          删除name='a3',因为间隙锁的缘故,会对 (24,a15)和(4,a3)之间加锁,(4,a3)和(5,a4)之间加锁。  很明显,如果我们想插入a2到name字段中,必然会因为间隙锁,而处于等待状态。     测试:session two      insert into test(id,name) values (30,'a2'); 插入等待,并且锁等待超时。      同样a3,a4之间插入数据也会处于等待超时。     这时很容易想到一个问题,如果间隙锁是在两组数据中间加锁,那么如果我插入a3两边的数据,a15或者a4,是否会出现锁等待呢。  继续做测试:   继续插入:insert into test(id,name) values(20,'a15');                   insert into test(id,name) values(26,'a15');  可以看到插入ID 20很快成功,插入ID 26 出现锁等待。  同样是a15,因为ID不同,结果不一样,是什么原因呢。  我们来看插入后的一个查询,很容易就理解了:   这个查询是按照name列的索引做的顺序排序,我们可以看到 (20,a15)已经插入成功。  我们已经知道在(24,a15)和(4,a3)之间存在间隙锁,如果数据(26,a15)需要插入进去,那么必然会排在24 a15之后  形成:  20   a15  24   a15  26   a15  4     a3  而这样的数据必然会被间隙锁阻塞,因此导致锁等待。  所以我们在上面明确间隙锁的时候,需要书写一组数据(主键列,辅助索引列),而不是单单只写一列。     最后得出结论:  间隙锁锁定了辅助索引两个叶子节点之间的内容,会造成锁定多余区域的数据。  先delete再insert的操作时常会导致死锁情况的出现。  应用程序sql中,在做删除或者更新操作中,对于过滤条件尽量选择主键列或者唯一索引列 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/qq_40026782/article/details/98074742 
总条数:973 到第
上滑加载中