标签: 数据库

渣渣辉 | 6天前 | 数据库MySQL

MySQL 模糊查询再也不用like+%了

前言 我们都知道 InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效,但有时需求就是如此,类似这样的需求还有很多。 例如,搜索引擎需要根基用户数据的关键字进行全文查找,电子商务网站需要根据用户的查询条件,在可能需要在商品的详细介绍中进行查找,这些都不是 B+ 树索引能很好完成的工作。 通过数值比较,范围过滤等就可以完成绝大多数我们需要的查询了。但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较,全文索引就是为这种场景设计的。 全文索引(Full-Text Search)是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等信息,也可以进行各种统计和分析。 在早期的 MySQL 中,InnoDB 并不支持全文检索技术,从 MySQL 5.6 开始,InnoDB 开始支持全文检索 倒排索引 全文检索通常使用倒排索引(inverted index)来实现,倒排索引同 B+Tree 一样,也是一种索引结构。它在辅助表中存储了单词与单词...

 43 |  0 |  0 数据库MySQL

心如止水 | 1周前 | 数据库MySQL

MySQL 上亿大表,如何深度优化?

背景 XX实例(一主一从)xxx告警中每天凌晨在报 SLA 报警,该报警的意思是存在一定的主从延迟(若在此时发生主从切换,需要长时间才可以完成切换,要追延迟来保证主从数据的一致性) XX实例的慢查询数量最多(执行时间超过1s的sql会被记录),XX应用那方每天晚上在做删除一个月前数据的任务 分析 使用pt-query-digest工具分析最近一周的mysql-slow.log pt-query-digest --since=148h mysql-slow.log | less 结果第一部分 最近一个星期内,总共记录的慢查询执行花费时间为25403s,最大的慢sql执行时间为266s,平均每个慢sql执行时间5s,平均扫描的行数为1766万 结果第二部分 ![图片](https://static.developers.pub/78a1c6d207814450b73978f

 45 |  0 |  0 数据库MySQL

青木 | 1周前 | 数据库MySQL

MySQL 用 limit 为什么会影响性能?有什么优化方案?

Limit 是一种常用的分页查询语句,它可以指定返回记录行的偏移量和最大数目。例如,下面的语句表示从 test 表中查询 val 等于4的记录,并返回第300001到第300005条记录: select   from test where val=4 limit 300000,5; 这样的语句看起来很简单,但是在实际使用中,可能会出现性能问题。为什么呢?我们需要从 Mysql 的索引结构和查询过程来分析。 Mysql 的索引结构 Mysql 支持多种类型的索引,其中最常用的是 B+ 树索引。B+ 树索引是一种平衡多路查找树,它有以下特点: 树中的每个节点最多包含 m 个子节点,m 被称为 B+ 树的阶。 树中的每个节点最少包含 m/2(向上取整)个子节点,除了根节点和叶子节点。 树中的所有叶子节点都位于同一层,并且通过指针相连。 树中的所有非叶子节点只存储键值(索引列)和指向子节点的指针。 树中的所有叶子节点存储键值(索引列)和指向数据记录(聚簇索引)或者数据记录地址( 非聚簇索引 )的指针。 下图是一个 B+ 树索引的示例:

 54 |  0 |  0 数据库MySQL

念旧。 | 1周前 | 数据库MySQL

MySQL 主从 AUTO_INCREMENT 不一致问题分析

本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象,一旦触发了主从切换,业务的正常插入操作会触发主键冲突的报错提示。 一、问题描述 1.1 问题现象 在 MySQL 5.7 版本中,REPLACE INTO 操作在表存在自增主键的情况下,可能会出现表的auto_increment值主从不一致现象,如果在此期间发生主从故障切换,当原来的slave节点变成了新的master节点,由于表的auto_increment值是小于原主库的,当业务继续写入时,就会收到主键冲突的报错提示。 相关报错信息如下: ! 报错提示 ERROR 1062 (23000): Duplicate entry 'XXX' for key 'PRIMARY' 1.2 影响评估 在业务逻辑中使用了Replace into,或者INSERT...ON DUPLICATE KEY UPDATE。 一旦出现了表的auto_increment值主从不一致现象,在出现MySQL主从故障切换后,业务的正常写入会报主键冲...

 46 |  0 |  0 数据库MySQL

奈我何 | 1周前 | 数据库MySQL

破防了,谁懂啊家人们:记一次mysql问题排查

一、前言 谁懂啊家人们,作为一名java开发,原来以为mysql这东西,写写CRUD,不是有手就行吗;你说DDL啊,不就是设计个表结构,搞几个索引吗。 键盘撒一把冻干,我家猫也能来上班。——粥师傅 结果一次线上出问题了,一环接一环,不仅猫上不了班,晚上还得等我加班回家,眼巴巴吃不到冻干。 1.1 表结构 简单介绍一下出问题的表。 一张元数据表,提取出重点部分,抽象出来的结构如下, (id, group, code, name,property1, property2, ...) | id | group | code | name | property | | :-: | :---: | :-------: | :----: | :------: | | 1 | 业务1 | 事件1 | 吃冻干 | <br/ | | 2 | 业务1 | 事件2 | 喂猫粮 | <br/ | | 3 | 业务2 | 事件1 | 睡觉 | <br/ | | 4 | 业务3 | 事件1...

 52 |  0 |  0 数据库MySQL

iron Man | 1周前 | 数据库MySQL

遇到个MySQL索引长度限制的问题

前言 我只是创建个索引而已,没想到还这些遇到个诡异的问题!😱😱 话说你平时创建mysql时遇到过以下创建索引报错的情况吗? 报错提示如下 Specified key was too long; max key length is 767 bytes //需要添加索引的字段的长度太长,超过了767字节 🚩什么?索引长度限制?我从没遇到过啊,MySQL还会对索引键的长度有限制? 是的,一般都不会遇到,不过这个问题我一个同事就遇到了! 他用 同样表结构和加索引的语法 ,都是相同的,但是一个测试环境和一个线上MySQL版本,一个执行成功一个执行失败! 事故现场: 同事A的迭代开发测试完了,准备将环境放到预发布了,在添加索引的时候居然创建索引报错了,瞬间一脸郁闷,我测试过得了啊! 是的,没错,虽然测过了,但是因为版本不同,在为数据库字段类型(varchar(255))创建索引的时候,指定的字段有可能会超过了存储引擎默认的长度! 当然你会问,为啥要为varchar(255)创建索引啊,这个就不多追问了! 不过刚好趁对这个

 52 |  0 |  0 数据库MySQL

蔡文姬 | 2周前 | 数据库MySQL

MySQL定时任务,解放双手,轻松实现自动化

1概念 Mysql 事件是一种在特定时间点自动执行的数据库操作,也可以称呼为定时任务,它可以自动执行更新数据、插入数据、删除数据等操作,无需人工干预。 优势: 自动化: 可以定期执行重复性的任务,无需手动干预。 灵活性: 可以根据需求定制事件,灵活控制任务的执行时间和频率。 提高效率: 可以在非高峰时段执行耗时任务,减少对数据库性能的影响。 常见的应用场景有定时备份数据库,清理和统计数据。 2常见操作 事件调度器操作 查看事件调度器是否开启:ON 表示已开启。 show variables like '%event_scheduler%'; +-----------------+-------+ | Variable_name   | Value | +-----------------+-------+ | event_scheduler | ON    | +-----------------+-------+ 开启和关闭事件调度器:  开启事件调度器 set glob

 97 |  0 |  0 数据库MySQL

孤音 | 3周前 | 数据库MySQL

不引入ES,如何利用MySQL实现模糊匹配?

1. 业务场景概述 目标是实现一个公司的申请审批流程,整个业务流程涉及到两种角色,分别为 商务 角色与 管理员 角色。整个流程如下图所示: 流程图 核心流程总结为一句话: 商务角色申请添加公司后由管理员进行审批 。 商务在添加公司时,可能为了方便,直接填写公司简称,而公司全称可能之前已经被添加过了, 为了防止添加重复的公司 ,所以管理员在针对公司信息审批之前,需要查看以往添加的公司信息里有无同一个公司。 2. 实现思路 以上是一个业务场景的大概介绍。从技术层面需要考虑实现的功能点: 分词 与库里已有数据进行匹配 按照匹配度对结果进行排序 分词功能有现成的分词器,所以整个需求的核心重点在于 如何与数据库中的数据匹配并按照匹配度排序 。 3. 模糊匹配技术选型 方案一: 引入ES 方案二: 利用MySQL实现 本系统规模较小,单纯...

 88 |  0 |  0 数据库MySQL

OOM | 5周前 | 数据库MySQL

为什么高性能场景选用 Postgres SQL 而不推荐使用 MySQL?

一、 数据库简介 TLDR; 1.1 MySQL MySQL声称自己是最流行的开源数据库,它属于最流行的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。LAMP中的M指的就是MySQL。构建在LAMP上的应用都会使用MySQL。 MySQL最初是由 MySQL AB 开发的,然后在2008年以10亿美金的价格卖给了Sun公司,Sun公司又在2010年被Oracle收购。Oracle收购导致MySQL的出现两个版本:商业版和社区版。对于后者,由于Oracle控制了MySQL的开发,受到了广大使用者的批评。 1.2 PostgreSQL PostgreSQL标榜自己是世界上最先进的开源数据库,属于关系型数据库管理系统( ORDBMS ),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象 关系型数据库管理系统 ,最初是1985年在加利福尼亚大学伯克利分校开发的,作为Ingres数据库的后继。PostgreSQL是完全由社区驱动的开源项目。 它提供了...

 101 |  0 |  0 数据库MySQL

孤音 | 6周前 | 数据库MySQL

8种专坑同事 SQL写法,性能降低100倍,不来看看?

1、LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。 SELECT FROM operation WHEREtype = 'SQLStats' ANDname = 'SlowLog' ORDERBY create_time LIMIT1000, 10; 好吧,可能90%以上的 DBA 解决该问题就到此为止。但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员仍然会抱怨:我只取10条记录为什么还是慢? 要知道数据库也并不知道第1000000条记录从什么地方开始,即使有索引也需要从头计算一次。出现这种性能问题,多数情形下是程序员偷懒了。 在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的。SQL 重新设计如下: SELECT FROM oper

 114 |  0 |  0 数据库MySQL

渣渣辉 | 6周前 | 数据库后端相关

分布式场景怎么Join?

背景 最近在阅读查询优化器的论文,发现System R中对于Join操作的定义一般分为了两种,即嵌套循环、排序-合并联接。 考虑到我的领域是在处理分库分表或者其他的分区模式,这让我开始不由得联想我们怎么在分布式场景应用这个Join逻辑,对于两个不同库里面的不同表我们是没有办法直接进行Join操作的。查阅资料后发现原来早有定义,即分布式联接算法。 分布式联接算法 跨界点处理数据即分布式联接算法,常见的有四种模型: Shuffle Join (洗牌联接)、 Broadcast Join (广播联接)、 MapReduce Join (MapReduce联接)、 Sort-Merge Join (排序-合并联接)。 接下来将进行逐一了解与分析,以便后续开发的应用。 Shuffle Join(洗牌联接) 先上原理解释: “ Shuffle Join 的核心思想是将来自不同节点的数据重新分发(洗牌),使得可以联接的数据行最终位于同一个节点上。 “通常,对于要联接的两个表,会对联接键应用相同的哈希函数,哈希函数的结果决定了数据行应该被发送到哪个节点。...

 93 |  0 |  0 数据库后端相关

一纸荒年 | 6周前 | 数据库Spring 全家桶后端相关

Spring Boot 3.2 新特性:JdbcClient

SpringBoot 3.2引入了新的 JdbcClient 用于数据库操作,JdbcClient对JdbcTemplate进行了封装,采用了 [fluent API]() 的风格,可以进行链式调用。 自此,spring自带的数据库操作有了4种方式:JdbcTemplate、JdbcClient、SpringDataJdbc、SpringDataJpa。 对于不适合使用复杂的[ORM框架](),或者需要编写复杂的SQL的场景,可以使用JdbcClient自己编写SQL来操作数据库。不过JdbcClient不支持数据的批量操作和存储过程调用,对于这种情况就需要使用JdbcTemplate。 具体的代码参照示例项目:https://github.com/qihaiyan/springcamp/tree/master/spring-data-jdbc-client 一、概述 JdbcClient是一个轻量的数据库操作框架,采用 fluent API 风格,简单灵活,易于阅读和维护,支持编写复杂的SQL。 二、引入 JdbcClient 首先引入 spring-da...

 118 |  0 |  0 数据库Spring 全家桶

雪千寻 | 6周前 | 数据库MySQL

8种专坑同事的 SQL 写法,性能降低100倍,不来看看?

--- sql语句的执行顺序: FROM <left_table ON <join_condition <join_type  JOIN <right_table WHERE <where_condition GROUP BY <group_by_list HAVING <having_condition SELECT DISTINCT <select_list ORDER BY <order_by_condition LIMIT <limit_number 1、LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。 SELECT  FROM   operation WH

 118 |  0 |  0 数据库MySQL

青木 | 2个月前 | 数据库

让 数据库 和 缓存 数据保持一致的三种策略

一、背景 目前随着缓存架构方案越来越成熟化,通常做法是引入「缓存」来提高读性能,架构模型就变成了这样: 先来看一下什么时候创建缓存,前端请求的读操作先从缓存中查询数据,如果没有命中数据,则查询数据库,从数据库查询成功后,返回结果,同时更新缓存,方便下次操作。 在数据不发生变更的情况下,这种方式没有问题,如果数据发生了更新操作,就必须要考虑如何操作缓存,保证一致性。 如何保证缓存和数据库的一致性,这算得上是个老生常谈的话题啦,看到好多技术新人在写更新缓存数据代码,采用了非常复杂甚至“诡异”的方案,甚为不解。 今天就一起花点儿时间来聊聊吧 二、缓存和数据库数据一致性问题 1)先更新缓存,后更新数据库 如果缓存更新成功了,但数据库更新失败,那么此时缓存中是最新值,但数据库中是「旧值」。 虽然此时读请求可以命中缓存,拿到正确的值,但是,一旦缓存「失效」,就会从数据库中读取到「旧值」,...

 87 |  0 |  0 数据库

女王范 | 2个月前 | 数据库MySQL

MySQL中这14个小技巧,惊艳到我了

前言 我最近几年用 MYSQL 数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。 1.group_concat 在我们平常的工作中,使用 group by 进行分组的场景,是非常多的。 比如想统计出用户表中,名称不同的用户的具体名称有哪些? 具体sql如下: select name from  user group by name; 但如果想把name相同的code拼接在一起,放到另外一列中该怎么办呢? 答:使用 group_concat 函数。 例如: select name,group_concat(code) from  user group by name; 执行结果:使用 group_concat 函数,可以轻松的把分组后,name相同的数据拼接到一起,组成一个字符串,用 逗号 分隔。 2.char_length 有

 112 |  0 |  0 数据库MySQL