db + diff mysql oracle / diff mysql 5.7 mysql 8.0 / diff mysql postgresql

s

- mysql 索引类型

索引类型 用途 特点
B-Tree 索引 各种数据类型的等值查询、范围查询和排序 二叉树结构,适用于各种数据类型
哈希索引 提高等值查询性能 哈希函数映射索引列值,不支持范围查询和排序
全文索引 全文搜索 支持自然语言查询
空间索引 地理空间数据查询 用于支持地理位置或几何形状的查询
联合索引 优化多列查询性能 将多个列组合在一起创建的索引
唯一索引 保证索引列值的唯一性 防止重复数据
前缀索引 优化存储和查询 仅使用列值的前缀部分来构建索引

- mysql 与 PostgreSQL区别

功能/特性 MySQL 8 PostgreSQL
开发公司 Oracle Corporation PostgreSQL Global Development Group
开源许可 GPL 2.0 PostgreSQL License
存储引擎 InnoDB(默认),MyISAM,等 默认为PostgreSQL,支持多种插件引擎
JSON 数据类型 支持 支持
全文搜索 支持全文索引和全文搜索 支持全文搜索
空间数据类型 支持空间数据类型(GIS) 支持PostGIS插件,用于空间数据
事务管理 ACID 兼容 ACID 兼容
并发控制 MVCC(多版本并发控制) MVCC(多版本并发控制)
存储过程和触发器 支持 支持
外键 支持 支持
分区表 支持 支持
备份和恢复 使用mysqldump和InnoDB备份工具 使用pg_dump和pg_restore
扩展性 支持垂直和水平扩展 支持垂直和水平扩展
性能优化 使用索引提示,分区表等进行性能优化 使用查询优化器,索引和统计信息进行优化
触发器 支持 支持
并发连接 多线程 多进程
用户定义函数(UDF) 支持 支持
多版本控制(MVCC)
主从复制 支持 支持
窗口函数 支持 支持
自增长列 自动增长列 SERIAL 类型
自动递增列 支持 支持
外部数据表 支持通过存储引擎实现 支持通过外部表实现

性能方面 MySQL 8 PostgreSQL
读性能 在一些情况下,MySQL 8 可以更好地处理读取密集型工作负载。 PostgreSQL 通过MVCC和优化的查询计划提供强大的读性能。
写性能 对于写入密集型工作负载,MySQL 8 可能有优势。 PostgreSQL 在高并发写入情境中可能受到MVCC的影响,但通过适当的调优和索引设计,也能获得很好的写性能。
并发连接 MySQL 8 处理大量并发连接的能力相对较好。 PostgreSQL 使用MVCC,具有良好的并发处理能力。
事务处理 两者都提供ACID兼容性,但在某些情况下可能有微小差异。 两者都提供ACID兼容性,但实际性能可能受到具体的事务实现和工作负载的影响。
索引优化 MySQL 8 通过使用索引提示和查询缓存来进行索引优化。 PostgreSQL 通过查询优化器和统计信息来进行索引优化。
备份和恢复 使用mysqldump和InnoDB备份工具进行备份和恢复。 使用pg_dump和pg_restore进行备份和恢复。
全文搜索性能 MySQL 8 提供全文搜索功能,但性能可能受到具体使用情境的影响。 PostgreSQL 的全文搜索性能通常被认为较好,特别是使用tsvector和tsquery类型。
空间数据性能 MySQL 8 支持空间数据类型,但在GIS方面可能不如PostGIS强大。 PostgreSQL 的PostGIS插件提供强大的空间数据处理能力。
自增长列性能 两者都支持自增长列,性能相当。 两者在自增长列方面性能相当。

 - mysql 与 oracle的几点区别

序号 mysql oracle DB2 备注
1.组函数用法规则 mysql中组函数在select语句中可以随意使用 oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错   select name,count(money) from user;这个放在mysql中没有问题在oracle中就有问题了。
2.自动增长的数据类型处理 MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值

ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;

其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999

INSERT语句插入这个字段值为:序列号的名称.NEXTVAL

   
3.单引号的处理 MYSQL里可以用双引号包起字符串

 ORACLE里只可以用单引号包起字符串

在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

   
 4.分页的SQL语句的处理

 MYSQL处理分页的SQL语句比较简单,用LIMIT开始位置,记录个数,PHP里还可以用SEEK定位到结果集的位置

-

-- MySQL使用LIMIT和OFFSET关键字进行分页。
SELECT * FROM your_table
LIMIT 10 OFFSET 20;

-

 ORACLE处理分页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80。

以下是经过分析后较好的两种ORACLE翻页SQL语句(ID是唯一关键字的字段名):

-

-- 语句一 :
SELECT ID,
[FIELD_NAME,...]
FROM TABLE_NAME
WHERE ID IN (
SELECT ID
FROM (
SELECT ROWNUM AS NUMROW,
ID
FROM TABLE_NAME
WHERE 条件1
ORDER BY 条件2
)
WHERE NUMROW > 80
AND NUMROW < 100
)
ORDER BY 条件3;
-- 语句二 :
SELECT *
FROM (
(
SELECT ROWNUM AS NUMROW,
c.*
from (
select [FIELD_NAME,...]
FROM TABLE_NAME
WHERE 条件1
ORDER BY 条件2
) c
)
WHERE NUMROW > 80
AND NUMROW < 100
)
ORDER BY 条件3;

-

-- 在Oracle数据库中,通常使用ROWNUM或OFFSET FETCH来实现分页。
SELECT * FROM (
SELECT your_table.*, ROWNUM AS rnum
FROM your_table
WHERE ROWNUM <= 30
)
WHERE rnum >= 21;
-- 在Oracle 12c及更高版本中,也可以使用OFFSET FETCH
SELECT * FROM your_table
ORDER BY your_ordering_column
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

-

-

-- 在DB2中,可以使用FETCH FIRST和OFFSET进行分页。
SELECT * FROM your_table
ORDER BY your_ordering_column
OFFSET 20 ROWS
FETCH FIRST 10 ROWS ONLY;

-

 
 5.长字符串的处理  -  长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。    
 6.日期字段的处理

 MYSQL日期字段分DATE和TIME两种

MYSQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)

MYSQL中插入当前时间的几个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())

 ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式,可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;

oracle中当前时间是sysdate

   
 7.空字符的处理  MYSQL的非空字段也有空的内容

 ORACLE里定义了非空字段就不容许有空的内容

按MYSQL的NOT NULL来定义ORACLE表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

   
 8.字符串的模糊比较  MYSQL里用字段名like%‘字符串%’  ORACLE里也可以用字段名like‘字符串%’但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,‘字符串’)>0会得到更精确的查找结果。    
 9.程序和函数里    操作数据库的工作完成后请注意结果集和指针的释放。    
10 视图 MySQL 视图是存储在数据库中的虚拟表,它是由一个或多个基表(也可以是其他视图)的行和列组成的。使用视图可简化 SQL 语句,隐藏基表的一些细节,提高 SQL 的可读性和易用性。MySQL 视图有以下特点:

可以简化 SQL 查询;
可以对数据进行过滤、分组等操作;
可以通过将多个视图连接实现更复杂的查询;
可以使用“WITH CHECK OPTION”确保视图不违反其查询条件。

Oracle 视图是存储在内存中的虚拟表,它是由一个或多个基表(也可以是其他视图)的行和列组成的。在 Oracle 中,可以创建三种类型的视图:

可更新视图:可以对视图进行 INSERT、UPDATE 和 DELETE 操作,实际上是通过视图操作基表的实例;
可以查询的视图:只能进行查询,不支持更新;
双向视图:是可更新视图和可以查询的视图的组合,既可以进行查询,也可以进行更新。但是这种类型的视图只能用于特殊情况。

Oracle 视图可以同时执行 DML(INSERT、UPDATE、DELETE)和 DDL(CREATE、ALTER、DROP)操作,而 MySQL 视图只能执行 SELECT 操作;
Oracle 视图支持三种类型的视图,包括可更新视图、可查询视图和双向视图,而 MySQL 视图只支持可查询视图;
Oracle 视图是存储在内存中的,而 MySQL 视图则是存储在磁盘上的;
Oracle 视图支持更多的创建语法和操作,包括 WITH CHECK OPTION 等。

   
         
         
         
         
         
         
         
         
         

 - MySQL8.0与MySQL5.7差异分析 

mysql 1.x 最初版本 1995
mysql 3.x 基本数据库功能
mysql 4.0 引入存储过程,视图,游标
mysql 5.x 引入InnoDB 存储引擎、事件调度器、存储过程和视图
mysql 8.x 2018年。更新windows函数、common table expressions(CTE )和JSON 支持

- https://blog.csdn.net/m0_54849806/article/details/126113279

序号 比较项 mysql 5.7 mysql 8.0 备注
1 发布时间 2015 年 10 月 21 日发布 2018年4月20日发布  
2    无 增强包括:SQL窗口函数,公用表表达式,NOWAIT和SKIP LOCKED,降序索引,分组,正则表达式,字符集,成本模型和直方图  
3    无

JSON扩展语法,新功能,改进排序和部分更新。

使用JSON表函数,您可以使用JSON数据的SQL机制。
GIS地理支持。空间参考系统(SRS),以及SRS感知空间数据类型,空间索引和空间功能。
可靠性 DDL语句已变得原子性和崩溃安全,元数据存储在单个事务数据字典中。
由InnoDB提供支持!可观察性性能架构,信息架构,配置变量和错误记录的显着增强。
可管理性远程管理,撤消表空间管理和新的即时DDL。
安全 OpenSSL改进,新的默认身份验证,SQL角色,分解超级特权,密码强度等等。
性能 InnoDB在读/写工作负载,IO绑定工作负载和高争用“热点”工作负载方面明显更好。
增加了资源组功能,通过将用户线程映射到CPU,为用户提供一个选项,以针对特定硬件上的特定工作负载进行优化 。

 
4 4 账户与安全  grant all privileges on *.* to 'bertram'@'localhost' identified by '1q2w3e4r'; #grant all privileges on *.* to '用户名'@'主机' identified by '密码';

分开执行,否则出现sql语法错误:

mysql> create user 'bertram'@'localhost' identified by '1q2w3e4r';
Query OK, 0 rows affected (0.04 sec)
#create user '用户名'@'主机' identified by '密码';

mysql> grant all privileges on *.* to 'bertram'@'localhost';
Query OK, 0 rows affected (0.04 sec)
# grant all privileges on . to '用户名'@'主机';

 
5  认证插件更新  MySQL5.7 默认身份插件是 mysql_native_password

MySQL8.0 默认的身份插件是 caching_sha2_password
查看身份认证插件命令:show variables like 'default_authentication_plugin%';

mysql> show variables like 'default_authentication_plugin%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.01 sec)
身份认证插件可以通过以下2中方式改变: 
1)系统变量default_authentication_plugin去改变,在my.ini文件的[mysqld]下设置default_authentication_plugin=mysql_native_password
2)如果希望只是某一个用户通过mysql_native_password的方式认证,可以修改数据库mysql下面的user表的字段,执行以下命令:

mysql> alter user '用户名'@'主机' identified with mysql_native_password by '密码';

 
6  密码策略 -

MySQL8.0的密码管理策略有3个变量

password_history #修改密码不允许与最近几次使用或的密码重复,默认是0,即不限制  
password_reuse_interval #修改密码不允许与最近多少天的使用过的密码重复,默认是0,即不限制
password_require_current #修改密码是否需要提供当前的登录密码,默认是OFF,即不需要;如果需要,则设置成ON

查询当前MySQL密码管理策略相关变量,使用以下命令:

mysql> show variables like 'password%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| password_history | 0 |
| password_require_current | OFF |
| password_reuse_interval | 0 |
+--------------------------+-------+
3 rows in set (0.00 sec)

1)设置全局的密码管理策略,在my.ini配置文件中,设置以上3个变量的值这种设置方式,需要重启mysql服务器;某些生产环境不允许重启,MySQL8.0提供了关键字persist持久化:
mysql> set persist password_history=6; #这条命令会在下次服务器重启的时候除了读取全局配置文件,还会读取这个配置文件,这条配置就会被读入从而达到持久化的目的

2)针对某一个用户单独设置密码管理策略
mysql> alter user '用户名'@'主机' password history 5; #这个用户的password_history 就被设置成了5

查看一下:
mysql> show user,host,Password_reuse_history from user;

查看某一张的字段的所有字段,使用以下命令:
mysql> desc 表名;
对密码相关参数的修改
全局设置
第一种方式:修改 mysql 的配置文件,全局生效

## 找到mysql的配置文件 my.cnf, 我的在 /etc/my.cnf
vi /etc/my.cnf
# 新密码不能和前面三次的密码相同
password_history = 3 ;
# 新密码不能和前面九十天内使用的密码相同
password_reuse_interval = 90 ;
# 默认为off;为on 时 修改密码需要用户提供当前密码 (开启后修改密码需要验证旧密码,root 用户不需要)
password_require_current = on ;
第二种方式:或者使用 命令set persist password_history=6; 这个具体的实现是增加了一个配置文件

 
7  角色管理  -

角色:一组权限的集合
一组权限赋予某个角色,再把某个角色赋予某个用户,那用户就拥有角色对应的权限
1)创建一个角色
mysql> create role '角色1';

2)为这个角色赋予相应权限
mysql> grant insert,update on . to '角色1';

3)创建一个用户
mysql> create user '用户1' identified by '用户1的密码';

4)为这个用户赋予角色的权限
mysql> grant '角色1' on . to '用户1';

执行完上面4步,用户1就拥有了插入与更新的权限
5)再创建1个用户
mysql> create user '用户2' identified by '用户2的密码';

6)为这个用户赋予同样的角色
mysql> grant '角色1' on . to '用户2';

执行完上面2步,用户2也用了角色1的权限,即插入与更新
查看用户权限,执行以下命令:
mysql> show grants for '用户名';

7)启用角色,设置了角色,如果不启用,用户登录的时候,依旧没有该角色的权限
mysql> set default role '角色名' to '用户名';

8)如果一个用户有多个角色,使用以下命令
mysql> set default role all to '用户名';

MySQL中与用户角色相关的表:mysql.default_roles、mysql.role_edges。
9)撤销权限
mysql> revoke insert,update on . from '角色名';

 
         
         

 

end

posted @   siemens800  阅读(57)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示