自我成长 - 数据库
type: channel
link: https://yanxizhu.com/index.php/category/database/
description: 数据库
items: mysql-5.7.33-winx64.zip安装
items: Oracle 存储过程和函数
items: Oracle 触发器
items: Oracle 游标
items: Oracle控制语句
items: Oracle 权限、视图、约束
items: Oracle常用函数
items: MyCat的安装及使用
items: MyCat
items: MySQL优化

mysql-5.7.33-winx64.zip安装
type: item
date: 2022-12-11T10:10:36+00:00
description: mysql-5.7.33-winx64.zip安装一、解压到安装目录二、编写配置文件my.ini将编写好的配置文件放到mysql-5.7.33-winx64根目录下。配置文件如下：[mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql的安装目录 basedir = D:\\tools\mysql-5.7.33-winx64 # 设置mysql数据库的数据的存放目录 datadir = D:\\tools\mysql-5.7.33-winx64\data # 允许最大连接数 max_connections=20 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB注意：1、修改自己安装路径 2、使用管理员权限执行下面的安装命令三、执行安装脚本使用管理员权限打开cmd命令工具，进入D:\tools\mysql-5.7.33-winx64\bin目录。执行安装：1、初始化，生成data文件夹.（建议使用，不设置root密码）mysqld --initialize-insecure 或者 mysqld --initialize（不建议使用，生成一个随机的root密码）2、安装MySql服务mysqld -install3、启动服务net start mysql4、设置mysql密码使用空密码进入mysql数据库，设置密码。set password for root@localhost = password('helloworld');5、环境变量配置打开电脑环境变量配置系统环境，PATH环境变量下，新增bing目录D:\tools\mysql-5.7.33-winx64\bin

Oracle 存储过程和函数
type: item
date: 2022-12-08T14:54:00+00:00
description: Oracle 存储过程和函数函数一般是工具性的东西。存储过程一般是一些操作。一、Oracle 自定义函数语法：Create function 函数名称 return 返回值类型 as Begin ... End 函数名称;示例：统计t_book记录数create or replace function getbookCount return number as begin declare bookNum number; begin select count(*) into bookNum from t_book; return bookNum; end; end getbookCount;函数调用set serveroutput on begin dbms_output.put_line('t_book表有：' || getbookCount() || '条记录'); end;输出结果：带参数的函数示例：create or replace function getBookSum(table_name varchar2) return number as begin declare sumCount number; count_sql varchar2(200); begin count_sql:='select count(*) from ' || table_name; execute immediate count_sql into sumCount; return sumCount; end; end getBookSum;带参函数调用set serveroutput on begin dbms_output.put_line('表有：' || getBookSum('t_booktype') || '条记录'); end;输出结果：二、Oracle 存储过程语法：Create procedure 存储过程名称 as Begin ... End 存储过程名称； In 只进不出 Out 只出不进 In out 可进可出参数In 只进不出示例：向t_book中添加数据。create or replace procedure addBook(bookname in varchar2, booktypeId in number,price in number) as begin declare maxId number; begin select max(id) into maxId from t_book; insert into t_book(id,bookname,type_id,price) values(maxId+1, bookname,booktypeId,price); commit;--自动提交 end; end addBook;存储过程调用execute 存储过程名称(参数1，参数2.。。)；示例1：execute addBook('代码简洁之道',2,66);查询t_book结果：示例2：如果存在就不添加，没有记录才添加。create or replace procedure addCheckBook(boookn in varchar2, booktypeId in number,price in number) as begin declare maxId number; n number; begin select count(*) into n from t_book where bookname=boookn; if (n>0) then return; end if; select max(id) into maxId from t_book; insert into t_book(id,bookname,type_id,price) values(maxId+1, boookn,booktypeId,price); commit; end; end addCheckBook;调用存储过程execute addCheckBook('代码简洁之道2',2,66);此时已经存在，不在向t_book中添加记录。Out 只出不进示例1：返回添加记录前和添加记录后的总条数create or replace procedure addCheckBookCount(boookn in varchar2, booktypeId in number,price in number, befern out number, aftern out number) as begin declare maxId number; n number; begin select count(*) into befern from…

Oracle 触发器
type: item
date: 2022-12-07T13:59:35+00:00
description: Oracle 触发器具备某些条件，由数据库自动执行的一些DML 操作行为。一、语句触发器语句触发器针对整个表，作用整个表操作。一般用于权限判断之类的。常用行触发器。语法结构Create trigger 触发器名称 Before/after 触发动作 On 作用对象触发器谓词：INSERTING、UPDATING、DELETING示例1：向t_book插入数据之前判断，用户是否有权限执行查询操作。创建语句触发器：create trigger tr_book before insert on t_book begin if user!='hello' then raise_application_error(-20001,'权限不足'); end if; end;执行插入数据：insert into t_book values(6,'ooo',2,68,'男');提示结果：修改触发器：create or replace trigger tr_book before insert on t_book begin if user!='SCOTT' then raise_application_error(-20001,'权限不足'); end if; end;重新执行插入数据即可插入。insert into t_book values(6,'ooo',2,68,'男');查询结果：注意：多个可以用or连接示例：create or replace trigger tr_book before insert or update or delete on t_book begin if user!='hello' then raise_application_error(-20001,'权限不足'); end if; end; before insert or update or delete：插入、修改、删除之前判断是否有权限。进行插入、修改、删除操作:insert into t_book values(7,'occcc',2,88,'男'); delete from t_book where id=1; update t_book set price=89 where id=1;此时都提示:示例2：在对t_book增删改之后记录日志到t_book_log表中。编写行触发器：create or replace trigger tr_book_log after insert or update or delete on t_book begin if inserting then insert into t_book_log values(user, 'insert', sysdate); else if updating then insert into t_book_log values(user, 'upate', sysdate); else if deleting then insert into t_book_log values(user, 'delete', sysdate); end if; end if; end if; end;分别执行增删改操作：insert into t_book values(8,'866',2,88,'男'); delete from t_book where id=8; update t_book set price=88 where id=1;此时t_book_log表中已经有记录了。select * from t_book_log;查询结果：注意：判断增删改用的不是insert、delte、update，而是inserting、updating、deleting。二、行触发器行触发器针对行记录。一般用于记录操作日志。语法结构Create trigger 触发器名称 Before/after 触发动作 For each row On 作用对象只是语句触发器多了一个For each row示例1：当修改t_book增加一条数据时，t_booktype对应的类型名称就改为t_book中新增的书名作为类型名。为插入数据前t_book\t_booktype表数据：编写行触发器：create or replace trigger tr_bookandtype after insert on t_book for each row begin update t_booktype set booktypename=:new.bookname where id=:new.type_id; end;注意：触发器内置变量:old 表示旧行记录。:new 表示新插入行记录。执行插入操作：insert into …

Oracle 游标
type: item
date: 2022-12-06T14:53:00+00:00
description: 一、游标使用游标，我们可以对具体操作数据，比如查询的结果，对行，列数据进行更加细致的处理。以及对其他DML操作进行判断等操作；类似一个数据集合。1、语法declare cursor 游标名称 is 查询的sql;示例：declare cursor cu_book is select bookname,price from t_book;注意：游标默认是关闭的。2、打开右边open 游标名；示例：open cu_book;3、关闭游标close 游标名;示例：close cu_book;4、游标循环fetch 游标名 into 临时值1,临时值2...;循环将游标中的字段保存到临时值中。5、判断游标是否还有记录游标名%found二、示例set serverout on; --定义游标哦 declare cursor cu_book is select bookname,price from t_book; b_name varchar(20); b_price number; begin open cu_book; --打开游标 fetch cu_book into b_name,b_price; --循环游标取值 while cu_book%found loop --如果游标里面还有值就循环处理其它逻辑 dbms_output.put_line('书名：' || b_name || '价格' || b_price); fetch cu_book into b_name,b_price; end loop; close cu_book; end;输出结果：三、注意事项1、定义的游标默认是关闭的。2、while条件注意跳出。3、注意关闭游标。4、loop要有对应的end loop四、显示游标1、显示游标上面定义的临时变量的类型必须和游标里面查询表的字段类型一样，如果表的字段类型改了，定义的临时变量就会报错，类型不一样。因此就出现了显示游标。定义： 临时变量名 表明.字段名%type;上面一中示例改进成显示游标：set serverout on; --定义游标哦 declare cursor cu_book is select bookname,price from t_book; b_name t_book.bookname%type; b_price t_book.price%type; begin open cu_book; --打开游标 fetch cu_book into b_name,b_price; --循环游标取值 while cu_book%found loop --如果游标里面还有值就循环处理其它逻辑 dbms_output.put_line('书名：' || b_name || '价格' || b_price); fetch cu_book into b_name,b_price; end loop; close cu_book; end;输出结果：2、字段类型表示表中字段数据类型。%type3、行类型表示表中一行数据类型。%rowtype示例：set serverout on; --定义游标哦 declare cursor cu_book is select * from t_book; book t_book%rowtype; -- 行类型 begin open cu_book; --打开游标 fetch cu_book into book; --循环游标取值 while cu_book%found loop --如果游标里面还有值就循环处理其它逻辑 dbms_output.put_line('书名：' || book.bookname || '价格' || book.price); fetch cu_book into book; end loop; close cu_book; end;注意：1、游标数据变成select * 查询全部了。2、fetch循环游标时，是将游标里面记录复制到定义的book行类型变量里面了。3、取值时，是用行类型变量.字段名取值。输出结果：五、隐式游标不用显示定义游标，但是显示的功能更强大。1、DML 执行过程中为真，结束后为假SQL%ISOPEN 布尔型DML 执行过程中为真，结束后为假示例：begin if sql%isopen then dbms_output.put_line('游标打开的'); else dbms_output.put_line('游标未打开'); end if; end;输出结果：2、DML 语句成功执行的数据行数SQL%ROWCOUNT 整型代表DML 语句成功执行的数据行数示例：declare b_count number; begin sele…

Oracle控制语句
type: item
date: 2022-12-05T15:49:00+00:00
description: 一、Oracle控制语句1、编写语句--写了才会输出 set serverout on; --开始语句 begin --这里面开始写语句块 dbms_output.put_line('Hello'); --注意" ; "不要完了 --控制语句结束 end; --在对话框执行时，需要输入/2、执行语句3、定义变量-只定义变量 declare 变量名 数据类型; --定义变量并赋值 declare 变量名 数据类型:赋值;示例：--写了才会输出 set serverout on; --定义变量price并赋值，注意不是在语句块里面定义 declare price number:=100; --开始语句 begin --这里面开始写语句块 dbms_output.put_line('Hello'||price); --注意" ; "不要完了 --控制语句结束 end; --在对话框执行时，需要输入/注意：可以一次定义多个变量，不用每次都写declare。示例：set serverout on; --定义多个变量 declare price number:=100; productName varchar(20):='notebook'; begin -- 凭借符号|| dbms_output.put_line(price || productName); end;4、赋值定义变量并赋值--定义变量price并赋值100，注意不是在语句块里面定义 declare price number:=100;5、查询结果赋值into：将查询结果赋值给定义的变量select 查询字段1,查询字段2 into 赋值给定义的变量1,赋值给定义的变量1 from t_book where id=bs_id;示例：set serverout on; declare count_books number; begin select count(*) into count_books from t_book; dbms_output.put_line(count_books); end;定义多个变量查询结果赋值：直接有都好隔开。select id,price into new_id,max_price from t_book where id=bs_id;6、拼接拼接符号||set serverout on; begin -- 凭借符号|| dbms_output.put_line('Hello' || 'word'); end;二、控制语句注意：都是写在语句块里面。1、普通-if条件语句 if 条件 then 条件成立逻辑 else 不成立逻辑 end if;注意：end if；示例：set serverout on; declare count_books number; begin select count(*) into count_books from t_book; dbms_output.put_line(count_books); if count_books > 2 then dbms_output.put_line('总记录数大于2'); else dbms_output.put_line('总记录数不大于2'); end if; end;输出结果：2、复杂-else-if示例：set serverout on; declare count_books number; begin select count(*) into count_books from t_book; dbms_output.put_line(count_books); if count_books = 1 then dbms_output.put_line('总记录数等于1'); else if count_books >2 then dbms_output.put_line('总记录数大于2'); else dbms_output.put_line('总记录数为0'); end if; end if; end;注意: 有多少个if，就必须要有多少个end if。三、流程控制1、case when then case 判断值 when 判断值等与值1 then 1满足时成立时逻辑; when 判断值等与值2 then 1满足时成立时逻辑; when 判断值等与值3 then 1满足时成立时逻辑; else 都不满足时逻辑; end case;注意：不要忘记end case;示例：set serverout on; declare count_books number; begin select count(*) into count_books from t_book…

Oracle 权限、视图、约束
type: item
date: 2022-12-01T16:11:16+00:00
description: Oracle 权限、视图、约束一、数据库权限1、查看用户所属角色select * from user_role_privs;2、查询角色权限CONNECT：仅连接权限select * from dba_sys_privs where grantee='CONNECT'查看RESOURCE权限：select * from dba_sys_privs where grantee='RESOURCE'DBA角色权限查看select * from dba_sys_privs where grantee='DBA'3、用户授权例如：授予scoot拥有dba的权限grant dba to scott;二、视图1、创建视图Create view 视图名称as 查询语句 create view v_emp1 as select ename,job from emp;2、修改视图create or replace view 始图名称 as 新的查询数据； create or replace view vemp as select empno,ename,job from EMP t;注意与创建视图的不同：多了一个or replace3、删除视图drop view 视图名称； drop view vemp2;4、使用视图select * from 视图； select * from vemp;就当作是一张虚拟的表使用。5、修改视图数据注意：修改视图数据，实际是修改实际表的数据，不是视图的数据。例如修改上面视图数据：update vemp set ename='xxxx' where job='CLERK' and empno='7369'修改后：最后实际修改的是，视图中查询数据表的实际数据。上面视图实际修改的是EMP表的数据：select * from EMP;注意：修改视图数据时，实际是修改实际表的数据，不是视图的数据。6、视图添加数据注意：向视图数据添加数据，实际是向实际表中添加数据和普通表添加数据一样，视图只是在向实际的表添加数据 insert into vemp values('1111','bbbbb','teacher');查看添加视图数据，实际是向实际表中添加了数据。select * from vemp;查看实际表中数据：select * from EMP;7、删除视图中数据和普通删除表数据一样，实际是删除的实际表中数据。delete from vemp where empno=1111总结：对视图中数据的CRUD实际是对真实表的数据操作，实际开发中一般都会将视图设置为只读，防止误操作。8、只读视图Create view 视图名称as 查询语句 with read only;当向视图添加、删除、修改数据时，都会提示“无法对只读视图执行dml操作”。三、约束1、主键约束（Primary）用来标识唯一一条记录的。非空，和其它表的外键有关系，其它表的外键关联该表的主键，起到约束作用。一般用作条件查询、条件修改、条件删除等操作。id设置为主键。查询一条数据：insert into t_bookType values(1,'java history');查看数据：select * from t_bookType;查看建外键sql语句：查看sql：这里就能看到建表、建主键的sql语句了：2、外键约束(Foreign)起到约束作用。新建表：创建外键：注意：另一张表t_bookType的主键id不能为空，否则建外键时会报错id不能为空。查看建外键sql语句和上面一样：约束作用：查看t_bookType数据：向t_book添加数据时：添加一条不存在的主键数据时，就会提示“违反完整约束条件”因此起到了，约束添加的外键只能是另一张表里面存在的主键。3、唯一性约束(Unique)约束某些字段值作为唯一标识，不能重复添加相同数据。添加方式查看sql脚本同上：没加约束前，可以添加相同bookTypeName的记录，加了约束后会提示报错"违反唯一约束条件"4、检查约束（针对所有记录，上面1、2、3都是正对一条记录）给某个字段添加，写入值的条件。t_book增加价格price字段：查询t_book:如果以后向每次添加数据时，检查price价格返回是否在50-100之间，就可以使用检查约束。添加检查约束sql：添加数据价格在范围内不报错，超出范围会提示报错“范围检查约束条件”5、默认值约束其实就是添加数据时，某些字段没有设置时，给字段设置默认值。t_book增加作者性别字段：添加一条数据：insert into T_BOOK(id,BOOKNAME,TYPE_ID,price) values(3,'jvm并发',1,66);新加数据sex性别为空，不符合实际逻辑，怎…

Oracle常用函数
type: item
date: 2022-11-24T15:15:00+00:00
description: 一、Oracle 表空间一个数据库可以有多个表空间，一个表空间里可以有多个表。表空间就是存多个表的物理空间；可以指定表空间的大小位置等。创建表空间create tablespace ts1 datafile 'C:\tablespace\ts1.dbf' size 50M;自动扩展大小create tablespace ts2 datafile 'C:\tablespace\ts2.dbf' size 50M autoextend on next 10M;设置最大空间create tablespace ts3 datafile 'C:\tablespace\ts3.dbf' size 50M autoextend on next 10M maxsize 1024M;更改用户默认表空间alter database default tablespace ts1;表空间改名alter tablespace ts1 rename to tss1;删除表空间drop tablespace ts2 including contents and datafiles;二：虚拟表dual 表Dual 表是sys 用户下的一张虚表；提供一些运算和日期操作时候用到；例如，查询系统日期时间select sysdate from dual;三、序列序列作为数据库里的对象，主要作用是生成唯一的主键值；创建序列create sequence 序列名称； 重要属性： 序列名称.currval 当前值nextval 下一个值 指定初始值： start with xx序列属性Minvalue maxvalue 最大值和最小值默认最小值1 最大值10 的27 次方； Increment by 属性序列增长步长默认值1 Cycle 设置循环； （了解即可，不使用）； Cache 缓存设置； 一次获取序列的多个连续值，默认20 ，放到内存中，方便下次快速获取；四、CRUD1、表的CRUD创建表create table 表名 ( 字段名1 字段类型 默认值 是否为空 ， 字段名2 字段类型 默认值 是否为空， 字段名3 字段类型 默认值 是否为空， … );示例：create table T_BOOK_LOG ( operusers VARCHAR2(10) not null, optertype VARCHAR2(10), optertime DATE )修改表名rename 旧表名 to 新表名；示例：rename t_book to t_books;删除表删除所有数据，会删除表结构drop table 表名；示例：drop table T_BOOKs;修改表添加新字段alter table 表名 add(字段名 字段类型 默认值 是否为空);示例：alter table t_book add(booknum number(6) default 0 null);字段添加注释comment on column 表明.字段 is '注释内容';示例：comment on column t_book.booknum is '书本数量';修改字段类型属性alter table 表名 modify (字段名 字段类型 默认值 是否为空);示例：alter table t_book modify (booknum varchar2(20) default 'hello');修改字段名alter table 表名 rename column 列名 to 新列名;示例：alter table t_book rename column booknum to remark;删除字段alter table 表名 drop column 字段名；示例：alter table t_book drop column remark;2、数据的CRUDinsert给指定列插入数据：insert into dept(deptno,dname) values(50,'xx'); 插入全部列数据：insert into dept(deptno,dname,loc) values(60,'xx','lll'); 简写insert into dept values(70,'xxx','llll');update更新指定数据：update dept set dname='司法部' where deptno=50; update dept set dname='司法部' ,loc='china' where deptno=50;delete删除指定数据：delete from dept where deptno=70; 删除指定条件的数据：delete from dept where deptno>40;tru…

MyCat的安装及使用
type: item
date: 2022-04-14T14:48:00+00:00
description: MyCat的安装及使用一、MyCat的安装1、环境准备​ 本次课程使用的虚拟机环境是centos6.5，首先准备四台虚拟机，安装好mysql，方便后续做读写分离和主从复制。192.168.85.111 node01 192.168.85.112 node02 192.168.85.113 node03 192.168.85.114 node04​ 安装jdk​ 使用rpm的方式直接安装jdk，配置好具体的环境变量2、安装​ 从官网下载需要的安装包，并且上传到具体的虚拟机中，我们在使用的时候将包上传到node01这台虚拟机，由node01充当MyCat。​ 下载地址为：http://dl.mycat.org.cn/1.6.7.5/2020-4-10/解压文件到/usr/local文件夹下tar -zxvf Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz -C /usr/local配置环境变量vi /etc/profile 添加如下配置信息： export MYCAT_HOME=/usr/local/mycat export PATH=$MYCAT_HOME/bin:$PATH:$JAVA_HOME/bin当执行到这步的时候，其实就可以启动了，但是为了能正确显示出效果，最好修改下MyCat的具体配置，让我们能够正常进行访问。3、配置MyCat​ 进入到/usr/local/mycat/conf目录下，修改该文件夹下的配置文件1、修改server.xml文件<?xml version="1.0" encoding="UTF-8"?> <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. --> <mycat:server xmlns:mycat="http://io.mycat/"> <user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <property name="defaultSchema">TESTDB</property> </user> </mycat:server>2、修改schema.xml文件<?xml version="1.0"?> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database="msb" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.85.111:3306" user="root" password="123456"> <r…

MyCat
type: item
date: 2022-04-14T14:24:50+00:00
description: MyCat一、基础知识1、分布式系统​ 分布式系统是指其组件分布在网络上，组件之间通过传递消息进行通信和动作协调的系统。它的核心理念是让多台服务器协同工作，完成单台服务器无法处理的任务，尤其是高并发或者大数据量的额任务。它的特点是：​ 透明性：分布式系统对于用户是透明的，一个分布式系统在用户面前的表现就像一个传统的单处理机分时系统，可用用户不必了解其内部结构就能使用;​ 扩展性：分布式系统的最大特点是可扩展性，它能够根据需求的增加而扩展，可以通过横向扩展使集群的整体性能得到线性提升，也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升;​ 可靠性：分布式系统不允许单点失效的问题存在，它的基本思想是，如果一台机器坏了，则其他机器能够接替它进行工作，具有持续服务的特性;​ 高性能：高性能才是设计分布式系统的初衷.​ 分布式系统的缺点：​ 1、在节点通信部分的开销比较大，线程安全问题也变得复杂，需要在保证数据完整性的同时兼顾性能​ 2、过分依赖网络，网络信息的丢失和饱和将会抵消分布式系统的大部分优势​ 3、有潜在的数据安全和网络安全等安全性问题。2、分布式数据库​ 随着技术的发展，各个行业所产生的数据量呈爆炸式增长，动辄就达到数百TB或者PB的级别，已经远远超过了传统单机数据库的处理能力，因此分布式数据库已经成为了最最迫切的需求。​ 分布式数据库是指数据在物理上分步而在逻辑上集中管理的数据库系统。物理上分步是指分布式数据库的数据分步在物理位置不同并由网络连接的节点或站点上；逻辑上集中是指各数据库节点之间在逻辑上是一个整体，并由统一的数据库管理系统管理，不同的节点分步可以跨不同的机房、城市甚至国家。​ 分布式数据库的特点:​ 透明性：用户不必关系数据的逻辑分区和物理位置分步的细节，也不必关系重复副本的一致性问题，同时不必关系在局部场地上数据库支持哪种数据模型，对于开发工程师而言，当数据库从一个场地移到另一个场地时必须改写应用程序，使用起来如果一个数据库。​ 数据冗余性：分布式数据库通过冗余实现系统的可靠性、可用性，并改善其性能。多个节点存储数据副本，当某一个节点的数据遭到破坏时，冗余的副本可保证数据的完整性；当工作的节点受损害时，可通过心跳等机制进行切换，系统整体不被破坏。还可以通过热点数据的就近分步原则减少网络通信的消耗，加快访问速度，改善性能。​ 易于扩展性：在分布式数据库中能够方便地通过水平扩展提高系统的整体性能，也能够通过垂直扩展来提高性能，扩展并不需要修改系统程序。​ 自治性：各节点上的数据由本地的DBMS管理，具有自治处理能力，完成本场地的应用或局部应用​ 分布式数据库还具有经济、性能优越、响应速度更快、灵活的体系结构、易于继承现有系统等特点。3、分布式数据库的实现原理​ 分布式数据库具有逻辑整体性、物理分布式，正是因为其物理分布性才使得分布式数据库的实现变得更加复杂，因为数据划分后存储在不同的节点上，而为了保证可靠性，需要存储多个副本，所以产生了数据复制的问题。为了保证良好的性能，分布式数据库必须易于扩展，具体来讲分布式数据库应有4个优势：数据分片及复制管理、具有事务的可靠性存取、良好的性能、易于扩展，所以分布式数据库在设计上需要实现数据库数据库的目录管理、数据分片、分布式查询处理、分布式并发控制、分布式锁管理、分布式存储、分布式网络架构、分布式安全管理等。​ 1、分布式数据库的目录管理​ 分布式数据库的目录存放着系统元数据及数据库的元数据的全部信息，这些数据的存在是为了正确、有效地访问数据。数据的增删改查操作都需要用到目录，用户授权、安全管理及并发控制等也都需要用到目录，目录结构的合理性直接影响数据库的性能。目录一般包括各级的描述、访问方法的描述、关于数据库的统计数据和一致性信息等，系统根据这些信息将用户查询转换为物理数据库上的查询，选择一条最佳的存取路径进行事务管理及安全性、完整性检查等。​ 分布式数据库的目录课分为全局目录、分布式目录、全局与本地混合目录。​ 2、数据分片​ 当数据库过于庞大，尤其是写入过于频繁且很难由一台主机支撑时，我们还是会面临扩展瓶颈。我们将存放在同一个数据库实例中的数据分散存放到多个数据库实例上，进行多台设备存取以提高性能，在切分数据的同时可以提高系统整体的可用性。​ 数据分片是指将数据全局地划分为相关的逻辑片段，有水平切分、垂直切分、混合切分三种类型。​ 水平切分：按照某个字段的某种规则分散到多个节点库中，每个节点中包含一部分数据。可以将数据的水平切分简单理解为按照数据行进行切分，就是将表中的某些行却分到一个节点，将另外某些行切分到其他节点，从分布式的整体来看它们是一个整体的表​ 垂直切分：一个数据库由很多表构成，每个表对应不同的业务，垂直切分是指按照业务将表进行分类并分不到不同的…

MySQL优化
type: item
date: 2022-03-20T15:45:00+00:00
description: 索引一、全表扫描没有使用索引的时候，数据的查询需要进行多次IO读写，这样的性能较差——全表扫描的过程。二、索引为数据库的某个字段创建索引，相当是为这个字段的内容创建了一个目录。通过这个目录可以快速的实现数据的定位，也就是通过索引能够快速的找到某条数据所在磁盘的位置。三、索引存放位置InnoDB存储引擎的表：将索引和数据存放在同一个文件里。（为什么？有什么优势？）*ibdMyISAM存储引擎的表：索引和数据分开两个文件来存储。 索引：*.MYI； 数据：MYD四、索引分类1、主键索引：主键自带索效果，也就意味着通过主键来查询表中的记录，性能是非常好的。2、普通索引：为普通列创建的索引。索引名一般格式: **idx_字段名** create index 索引名 on 表明(字段); 例子： create index idx_participant_ on cal_resource_permission(participant_);3、唯一索引：就像是唯一列，列中的数据是唯一的。比普通索引的性能要好。唯一索引名称：idx_unique_列明 create unique index 唯一索引名称 on 表明(列名); 例子： create unique index idx_unique_resource_id_ on cal_resource_permission(resource_id_);4、联合索引（组合索引）：一次性为表中的多个字段一起创建索引,最左前缀法则（如何命中联合索引中的索引列）。注意：一个联合索引建议不要超过5个列格式：联合索引名一般格式: idx_字段1_字段2_字段3 create index 联合索引名 on 表明(字段1,字段2,字段3); 例子： create index idx_resource_scope_type on cal_resource_permission(resource_id_,scope_,type_id_);5、全文索引：进行查询的时候，数据源可能来自于不同的字段或者不同的表。比如去百度中查询数据，yanxizhu，来自于网页的标题或者网页的内容。MyISAM存储引擎支持全文索引。在实际生产环境中，并不会使用MySQL提供的MyISAM存储引擎的全文索引功能来是实现全文查找。而是会使用第三方的搜索引擎中间件比如ElasticSearch（比较多）、Solr。索引使用的数据结构使用索引查找数据性能很快，避免了全表扫描的多次磁盘IO读写。但是我们发现，使用索引实际上也需要在索引中查找数据，而且数据量是一样的，那么凭什么索引就能快呢？这就跟索引使用了哪种数据结构支持快速查找。什么叫数据结构：存放数据的结构。比如：数组、链表、栈、堆、队列等等这些概念。一、线性表线性的维护数据的顺序。对于线性表来说，有两种数据结构来支撑：线性顺序表：相邻两个数据的逻辑关系和物理位置是相同的。线性链式表：相邻两个数据的逻辑关系和物理存放位置没有关系。数据是有先后的逻辑关系，但是数据的物理存储位置并不连续。线性链式表又分为单项链表和双向链表：单向链表：能够通过当前结点找到下一个节点的位置，以此来维护链表的逻辑关系结点结构：数据内容+下一个数据的指针双向链表：能够通过当前结点找到上一个或下一个节点的位置，双向都可找。结点结构：上一个数据的指针+数据内容+下一个数据的指针。时间复杂度（比较次数）/空间复杂度（算法需要使用多少个变量空间）顺序表和链式表的区别：顺序表--数组：进行数据的查询性能（可以通过数组的索引/下标），数组的查询性能非常好，时间复杂度是0（1）数组的增删性能是非常差。链式表--链表：查询的性能是非常差的：时间复杂度是O（n），增删性能是非常好。二、栈、队列、串、广义表栈分为：顺序栈、链式栈顺序栈链式栈栈特点:先进后出，FIFO。队列分为：顺序队列、链式队列顺序队列链式队列队列特点：先进先出。串：String定长串、StringBuffer/Stringbuilder动态串广义表：更加灵活的多维数组，可以在不同的元素中创建不同的维度的数组。树查找树的查找性能是明显比线性表的性能要好，有这么几种树：多叉树、二叉树、二又查找树、平衡二叉树、红黑树、B树、B+树一、多叉树：非二叉树二、二叉树：一个结点最多只能有2个子结点，可以是0、1、2子结点。三、二叉查找树：二又查找树的查找性能是ok的。查询性能跟树的高度有关，树的高度又根你插入数据的顺序有关系。特点：二又树的根结点的数值是比所有左子树的结点的数值大，比右子树的几点的数值小。这样的规律同样满足于他的所有子树。四、平衡二又树，又称为AVL树实际上就是遵循以下两个特点的二叉树：每棵子树中的左子树和右子树的深度差不能超过1；二叉树中每棵子树都要求是平衡二叉树；…