
数据库
文章平均质量分 74
数据库:
关系型数据库:mysql、
NoSql:redis、Memcache、MongoDb
狂奔的蜗牛Evan
hello world
展开
-
Oracle迁移OceanBase方案
参考文章1:蚂蚁集团数据库迁移OceanBase最佳实践。转载 2024-07-17 23:59:31 · 404 阅读 · 0 评论 -
oracle生产环境建索引建议使用online
不使用online,会锁表,此时所有的DML(insert,delete,update,select等)都被阻塞,将导致系统不能正常使用!是不是吓得你瑟瑟发抖?在线方式创建索引,锁的是行而非表,通过临时表进行索引的创建,所以不会影响DML操作,创建索引的速度慢一些,创建索引:CREATE INDEX 索引名 ON 表名(列名) online;online创建索引:CREATE INDEX 索引名 ON 表名(列名);非在线方式创建索引,锁表,优先创建索引,此时DML都被阻塞,所以速度快。转载 2023-09-18 23:42:44 · 1348 阅读 · 0 评论 -
Oracle create index 中途取消后应该如何处理
有时会遇到这样的情况,在创建索引的过程中啪叽网断了,会话中断;或者创建索引时觉得执行太慢,直接按了crtl+c取消,直接把运行窗口关了...尝试重新建索引的时候会遇到报错ORA-00095 索引名已存在,而drop index时又报错ORA-08104 this index is being online built or rebuilt查看ORA-08104介绍。转载 2023-09-15 00:34:14 · 278 阅读 · 0 评论 -
好好的系统,为什么要分库分表?
分库分表是在海量数据下,由于单库、表数据量过大,导致数据库性能持续下降的问题,演变出的技术方案。分库分表是由分库和分表这两个独立概念组成的,只不过通常分库与分表的操作会同时进行,以至于我们习惯性的将它们合在一起叫做分库分表。通过一定的规则,将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。预定义算法是事先已经明确知道分库和分表的数量,可以直接将某类数据路由到指定库或表中,查询的时候亦是如此。转载 2022-11-30 09:11:32 · 698 阅读 · 0 评论 -
Sqlserver 根据年月获取第一天和最后一天
函数datediff(month, 0, getdate())是计算当前日期和“1900-01-01 00:00:00.000”这个日期之间的月数。下一个函数是DATEADD,增加当前日期到“1900-01-01”的月数。通过增加预定义的日期“1900-01-01”和当前。记住:日期和时间变量和毫秒一样是从“1900-01-01 00:00:00.000”开始计算的。这就是为什么你可以在。这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特。.转载 2022-08-15 18:01:47 · 4597 阅读 · 0 评论 -
sql server字符集(Chinese_PRC_CI_AS等)
2.在中文字符集下使用nvarchar,最大长度可定义4000,这个4000是指字符个数(len()),即最大可以保存4000个英文字符,4000个中文字符;使用N''时,中文占2个字节,只可以存x/2个汉字,没有乱码,取出仍为汉字,说明在英文字符集下通过使用N''是可以保存汉字的;不论使用不使用N'',中文字符都占1个字节,即可以存x个中文,但只保存前半截中文编码,所以select结果为乱码;不使用N''时,中文占1个字节,可以存x个汉字,但都只存入汉字前半截字符编码,显示为乱码;...转载 2022-07-20 00:03:53 · 7262 阅读 · 0 评论 -
SQLite、MySQL、PostgreSQL:关系型数据库比较
自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛。面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景的数据库系统呢?一下便是SQLite、MySQL和这三个常用的、流行的关系型数据库管理系统(RDBMS),希望能对你有所帮助。O.S.Tezer分别从数据库支持的数据类型、优势、劣势、何时应该使用以及何时不应该使用该数据库这5个方面对SQLite、MySQL和PostgreSQL做了比较。...转载 2022-07-16 10:00:08 · 1544 阅读 · 0 评论 -
PostgreSQL大小写敏感
学习hibernate的时候,数据库用了PostgreSQL,第一节课就抛错,User实体映射没有死活不能导出表。总是提示这一句: ERROR: syntax error at or near "User"。 后来发现,如果把表名设成t_user这样的就行了,难道PostgreSQL不能用大写?又试试T_User,没有报错,到数据库里一看,哎?还是t_user!大写自动变小写了。PostgreSQL不识别大小写?用pgAdmin图形化界面创建一个User表完全没问题啊。....转载 2022-07-14 15:07:09 · 3959 阅读 · 0 评论 -
MyBatis-Plus学习路线
官方网址:简介 | MyBatis-PlusMyBatis-Plus(opens new window)(简称 MP)是一个MyBatis(opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。愿景我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。#特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性...转载 2022-05-12 00:30:24 · 215 阅读 · 0 评论 -
MySQL数据库中如何查询分组后每组中的最后一条记录
MySQL数据库中如何查询分组后每组中的最后一条记录方法一select *from messageswhereid in ( select max(id) fom messages group by name);-- 优化select b.*from (select max(`id`) as id from `messages` group by `name`) as ajoin `messages` as b on a.id = b.id;方法二...转载 2022-05-09 14:12:40 · 5872 阅读 · 3 评论 -
Mysql 字符集不一致导致连表异常的解决
做一个简单的如下的连表查询,居然直接提示错误,居然是字符集不一致的问题,本文记录一下mysql的字符集类型,感兴趣的可以了解一下。目录1. 解决方法 2. mysql字符集 字符集 校验规则 做一个简单的如下的连表查询,居然直接提示错误,居然是字符集不一致的问题,本文记录一下mysql的字符集类型,以及下面这个问题的解决方案 1 2 3 select a.id, b.id from tt as a, t2 as b where a.xx =转载 2022-04-19 15:39:11 · 2841 阅读 · 2 评论 -
索引失效的 10 种场景
我之前写的一篇文章《聊聊sql优化的15个小技巧》,自发表之后,在全网广受好评,被很多大佬转载过,说明了这类文章的价值。今天我接着上一期数据库的话题,更进一步聊聊索引的相关问题,因为索引是大家都比较关心的公共话题,确实有很多坑。不知道你在实际工作中,有没有遇到过下面的这两种情况: 明明在某个字段上加了索引,但实际上并没有生效。 索引有时候生效了,有时候没有生效。 今天就跟大家一起聊聊,mysql数据库索引失效的10种场景,给曾经踩过坑,或者即将要踩坑的朋友们一个参考。1.转载 2022-03-07 18:48:37 · 6287 阅读 · 5 评论 -
mysql强制使用索引
在公司后台某模块功能记录日志中有一个搜索功能,通过前段时间的产品使用时间区间进行搜索反馈有些卡顿,我发现这个搜索功能比较慢,要3秒左右才能出来,就决定对这里做一下优化。通过分析代码和SQL发现最核心的问题在于一个区间查询耗时太长,耗时2秒多,所以我决定看看这里能不能优化,其中核心SQL为SELECT * FROM XXX_log WHERE (`ctime` BETWEEN '2017-09-11 09:34:13' AND '2017-10-11 09:34:13')and id转载 2022-02-14 14:40:57 · 1514 阅读 · 0 评论 -
MySQL的语句执行顺序
MySQL的语句执行顺序MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。下面我们来具体分析一下查询处理的每一个阶段FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符转载 2021-12-09 09:35:05 · 220 阅读 · 0 评论 -
1.3 万亿条数据查询,如何做到毫秒级响应?TiDB介绍
知乎,在古典中文中意为“你知道吗?”,它是中国的 Quora,一个问答网站,其中各种问题由用户社区创建,回答,编辑和组织。作为中国最大的知识共享平台,我们目前拥有 2.2 亿注册用户,3000 万个问题,网站答案超过 1.3 亿。随着用户群的增长,我们的应用程序的数据大小无法实现。我们的 Moneta 应用程序中存储了大约 1.3 万亿行数据(存储用户已经阅读过的帖子)。由于每月累计产生大约 1000亿行数据且不断增长,这一数字将在两年内达到 3 万亿。在保持良好用户体验的同时,我.转载 2021-12-07 22:43:58 · 2817 阅读 · 0 评论 -
Mysql on duplicate key update用法及优缺点
在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPLICATE KEY UPDATE一步就可以完成(Mysql独有的语法)。ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索转载 2021-08-16 08:45:33 · 7260 阅读 · 1 评论 -
insert into 语句的四种写法
方式1、 INSERT INTO t1(field1,field2) VALUE(v001,v002);明确只插入一条Value方式2、 INSERT INTO t1(field1,field2) VALUES(v101,v102),(v201,v202),(v301,v302),(v401,v402);在插入批量数据时 方式2 优于 方式1.【特注】当 id 为自增,即idINT PRIMARY KEY AUTO_INCREMENT 时,执行 insert int...转载 2021-04-13 15:55:44 · 10952 阅读 · 0 评论 -
with admin option 与with grant option 的区别
with admin option 与with grant option 的区别目录1、with admin option 用于系统权限授权,with grant option 用于对象授权。2、给一个用户授予系统权限带上with admin option 时,此用户可把此系统权限授予其他用户或角色,但收回这个用户的系统权限时,这个用户已经授予其他用户或角色的此系统权限不会因传播无效,如授予A系统权限create session with admin option,然后A又把create转载 2021-04-12 11:38:09 · 1559 阅读 · 0 评论 -
MySQL-语句块-循环语句
mysql常见的三种循环方式:while、repeat和loop循环。还有一种goto,不推荐使用。1.while循环 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQL语句 DELIMITER // ..转载 2021-04-10 10:07:27 · 786 阅读 · 0 评论 -
项目报错 execute command denied to user ‘root‘@‘地址‘ for routine .....
关于项目迁移后无法访问原数据库的问题1、问题描述:将A服务器的项目代码迁移到B服务器,要求B的接口仍然访问A的数据库。报错如下: 错误信息:root用户禁止使用execute命令去执行数据库里面的程序(这里是函数),考虑是不是数据库权限的问题。1、给数据库root用户授予全部权限:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PA...转载 2021-04-09 17:26:29 · 2938 阅读 · 0 评论 -
(工具类)mybatis如何开启batch模式
一般来说,对于SSM项目工程来说,mybatis的ExectoryType默认是simple,那么又如何能动态使用batch模式呢?直接上源码实现干货:import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSes转载 2021-04-08 16:09:09 · 1643 阅读 · 0 评论 -
MyBatis批量插入几千条数据慎用foreach
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)<insert id="batchInsert" parameterType="java.util.List"> insert into USER (id, name) values <foreach collect...转载 2021-04-08 15:38:03 · 1910 阅读 · 0 评论 -
批处理 rewriteBatchedStatements=true(批量插入更新)
最近在优化大批量数据插入的性能问题。项目原来使用的大批量数据插入方法是Mybatis的foreach拼接SQL的方法。我发现不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,实际上在插入的时候仍然是一条条记录的插,速度远不如原来Mybatis的foreach拼接SQL的方法。这对于常理来说是非常不科学的。下面先罗列一下三种插入方式:public class NotifyRecordDaoTest extends BaseTest { @Reso.转载 2021-04-08 15:34:43 · 1581 阅读 · 0 评论 -
mybatis批量更新数据三种方法效率对比
探讨批量更新数据三种写法的效率问题。实现方式有三种,一种用for循环通过循环传过来的参数集合,循环出N条sql,另一种 用mysql的case when 条件判断变相的进行批量更新 还有一个是用ON DUPLICATE KEY UPDATE进行批量更新下面进行实现。注意第一种方法要想成功,需要在db链接url后面带一个参数 &allowMultiQueries=true即:jdbc:mysql://localhost:3306/mysqlTest?characte...转载 2021-04-08 10:48:25 · 957 阅读 · 0 评论 -
mysql实现oracle sequence方案
背景:先总结一下MYSQL 自增长与ORACLE 序列的区别:自增长只能用于表中的其中一个字段自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.自增长会把一个未指定或NULL值的字段自动填上.实验:我们可以用创建一个序列表,使用函数来获取序列的值1. 新建序列表[java]view plaincopydroptableifexiststb_sequence; createtabletb_sequence( ...转载 2021-04-06 16:28:34 · 300 阅读 · 0 评论 -
mysql修改字段长度命令_值得收藏:一份非常完整的 MySQL 规范
mysql修改字段长度命令_值得收藏:一份非常完整的 MySQL 规范一、数据库命令规范 二、数据库基本设计规范 三、数据库字段设计规范 四、索引设计规范 五、常见索引列建议 六、如何选择索引列的顺序 七、避免建立冗余索引和重复索引 八、优先考虑覆盖索引 九、索引SET规范 十、数据库SQL开发规范 十一、数据库操作行为规范一、数据库命令规范·所有数据库对象名称必须使用小写字母并用下划线分割·所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询...转载 2021-03-19 18:45:16 · 2205 阅读 · 0 评论 -
INSERT ... ON DUPLICATE KEY UPDATE
向数据库插入记录时,有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是insertOrUpdate操作。这种控制可以放在业务层,也可以放在数据库层,大多数数据库都支持这种需求,如Oracle的merge语句,再如本文所讲的MySQL中的INSERT ... ON DUPLICATE KEY UPDATE语句。 该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,并且表中已经存在了一条记录值为1,下面两个语句会有相同的效果:...转载 2021-03-19 16:03:43 · 876 阅读 · 0 评论 -
MyBatis千万级数据查询解决方案,避免OOM --流式查询Cursor
流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。如果没有流式查询,我们想要从数据库取 1000 万条记录而又没有足够的内存时,就不得不分页查询,而分页查询效率取决于表设计,如果设计的不好,就无法执行高效的分页查询。因此流式查询是一个数据库访问框架必须具备的功能。流式查询的过程当中,数据库连接是保持打开状态的,因此要注意的是:执行一个流式查询后,数据库访问框架就不负责关闭数据库连接了,需要应用在取完数据后自己关闭。MyB转载 2021-01-11 15:17:44 · 4713 阅读 · 5 评论 -
MySQL不会丢失数据的秘密,就藏在它的 7种日志里(bin log等)
进入正题前先简单看看MySQL的逻辑架构,相信我用的着。MySQL逻辑架构MySQL的逻辑架构大致可以分为三层: 第一层:处理客户端连接、授权认证,安全校验等。 第二层:服务器server层,负责对SQL解释、分析、优化、执行操作引擎等。 第三层:存储引擎,负责MySQL中数据的存储和提取。 我们要知道MySQL的服务器层是不管理事务的,事务是由存储引擎实现的,而MySQL中支持事务的存储引擎又属InnoDB使用的最为广泛,所以后续文中提到的存储引擎都以InnoD转载 2021-01-11 15:17:34 · 380 阅读 · 0 评论 -
SQL优化极简法则,还有谁不会?
“SQL 本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器、优化器实现、SQL 语句的执行顺序、索引以及统计信息的采集等,甚至应用程序和系统的整体架构。本文介绍几个关键法则,可以帮助我们编写高效的 SQL 查询;尤其是对于初学者而言,这些法则至少可以避免我们写出性能很差的查询语句。以下法则适用于各种关系型数据库,包括但不限于:MySQL、Oracle、SQL Serv...转载 2021-01-11 15:17:19 · 128 阅读 · 0 评论 -
深入解析MySQL分区(Partition)功能
深入解析MySQL分区(Partition)功能= 水平分区(根据列属性按行分)=举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。水平分区的模式:Range(范围)– 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区,80年代(1980's)的数据,90年代(1990's)的数据以及任何在2000年(包括2000年)后的数据。 Hash(哈希) – 这种模式允许DBA通过对表的一个或多个列的Hash K...转载 2021-01-04 15:59:29 · 1094 阅读 · 0 评论 -
搞懂MySQL分区
目录一.InnoDB逻辑存储结构 段 区 页 二.分区概述 分区 三.分区类型 RANGE分区 LIST分区 HASH分区 KEY分区 四.分区和性能回到顶部一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。段 段就是上图的segment区域,常见的段有数据段、索引段、回滚段等,在InnoDB存储引擎中,对段的管理都是由引..转载 2021-01-04 15:55:34 · 136 阅读 · 0 评论 -
透彻解读mysql的可重复读、幻读及实现原理
目录一、事务的隔离级别二、mysql怎么实现的可重复读举例说明MVCC的实现MVCC逻辑流程-插入MVCC逻辑流程-删除MVCC逻辑流程-修改MVCC逻辑流程-查询三、幻读快照读和当前读四、如何解决幻读事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读的?为什么会出现幻读?是否解决了幻读的问题?一、事务的隔离级别Read Uncommitted(未提交读)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的转载 2020-12-28 23:30:29 · 489 阅读 · 0 评论 -
求求你别再用offset和limit分页了
不需要担心数据库性能优化问题的日子已经一去不复返了。随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现,作为开发人员,我们要不断地打磨我们的 API,让它们提供可靠和有效的端点,从而毫不费力地浏览海量数据。如果你做过后台开发或数据库架构,你可能是这么分页的:如果你真的是这么分页,那么我不得不抱歉地说,你这样做是错的。你不以为然?没关系。Slack、Shopify 和 Mixmax 这些公司都在用我们今天将要讨论的方式进行分页转载 2020-09-17 09:31:23 · 213 阅读 · 0 评论 -
mysql5.7虚拟列初次尝试
添加虚拟列ALTER TABLE erp_new_source_reports add client_name VARCHAR(80) generated always as (clients->"$.name"); ALTER TABLE erp_new_source_reports add client_type VARCHAR(20) generated always as...转载 2020-05-08 17:01:17 · 380 阅读 · 0 评论 -
Mysql 5.7 的‘虚拟列’是做什么?
Mysql 5.7 中推出了一个非常实用的功能虚拟列Generated (Virtual) Columns对于它的用途,我们通过一个场景来说明假设有一个表,其中包含一个 date 类型的列`SimpleDate` dateSimpleDate 是一个常用的查询字段,并需要对其执行日期函数,例如SELECT ... WHERE dayofweek(SimpleDate)...转载 2020-05-08 16:44:34 · 556 阅读 · 0 评论 -
mysql-connector-java8导致java.util.Date时间入库mysql库相差13个小时
问题:mysql-connector-java8导致java.util.Date时间入库mysql库相差13个小时解决方案一:Java 连接数据库时指定时区。&serverTimezone=Asia/Shanghai解决方案二: 暂时使用低版本jar <properties> <...原创 2020-03-25 11:31:51 · 1111 阅读 · 0 评论 -
mysql批量插入语句执行失败的话,是部分失败还是全部失败
阅读目录一、前言 二、测试 三、结论回到顶部一、前言下面简单介绍下背景,如果看着觉得绕,直接跳到第二章。项目开发中,正好遇到这个问题。将一批从外部第三方接口获取到的数据存储到本地mysql数据库,假设接口返回的数据类型为A,经过A到B的转换规则转换后,要插入数据库的数据类型为B。那么在A获取到1000条记录,转换为1000条B记录,用mybatis的批...转载 2020-01-03 09:08:27 · 4812 阅读 · 0 评论 -
mysql中find_in_set()函数的使用及in()用法详解
这篇文章主要介绍了mysql中find_in_set()函数的使用以及in()用法详解,需要的朋友可以参考下1、find_in_set()函数的使用MySQL手册中find_in_set函数的语法解释:FIND_IN_SET(str,strlist)str 要查询的字符串strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22)查询字段(strl...转载 2019-12-26 10:25:39 · 385 阅读 · 0 评论 -
MySQL的sql_mode模式
阅读目录一,sql_mode值的含义 二,ANSI模式 三,STRICT_TRANS_TABLES模式 四,TRADITIONAL模式mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode:回到目录一,sql_mode值的含义 ONLY_FULL_GROUP_B...转载 2019-12-24 19:31:22 · 220 阅读 · 0 评论