标签: MySQL

观云 | 16小时前 | MySQL数据库

MySQL 巨坑:永远不要在 MySQL 中使用 UTF-8!!

问题的症结在于,MySQL的“utf8”实际上不是真正的UTF-8 简单概括如下 那么什么是编码?什么是UTF-8? MySQL简史 不过我可以试着猜测一下 为什么这件事情会让人如此抓狂 总结 --- 最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1 我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“😃”也是合法的UTF-8。 问题的症结在于,MySQL的“utf8”实际上不是真正的UTF-8 “utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。 MySQL一直没有修复这个bug,他们在2010年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题。 当然,他们并没有对新的字符集广而告之(可能是因为

 5 |  0 |  0 MySQL数据库

雪千寻 | 3天前 | MySQL数据库

MySQL联表查询优化

sql执行顺序 1. 执行FROM语句 2. 执行ON过滤 3. join添加外部行 4. 执行where条件过滤 5. 执行group by以及分组语句,(开始使用select中的别名,后面的语句中都可以使用别名) 6. 执行having 7. select列表 8. 执行distinct去重复数据 9. 执行order by字句 10. 执行limit字句 --- 多表联合查询优化建议 1、使用显示连接 left join (right join,inner join),尽量避免隐式连接(where逗号连接表 .... and .... and ...)这类写法,假设三张表每张表有一千条数据,本意想查出<=1000条数据,当使用where语句查询,就查出了1000 1000 1000=10亿条数据,很大程度上浪费了内存执行时间 ps:在不使用on语法时,join、 inner join 、逗号、cross jo...

 20 |  0 |  0 MySQL数据库

渣渣辉 | 2周前 | MySQL数据库

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

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

 63 |  0 |  0 MySQL数据库

心如止水 | 2周前 | 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

 59 |  0 |  0 MySQL数据库

青木 | 2周前 | 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+ 树索引的示例:

 64 |  0 |  0 MySQL数据库

念旧。 | 2周前 | 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主从故障切换后,业务的正常写入会报主键冲...

 58 |  0 |  0 MySQL数据库

奈我何 | 2周前 | 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...

 68 |  0 |  0 MySQL数据库

iron Man | 2周前 | MySQL数据库

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

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

 72 |  0 |  0 MySQL数据库

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

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

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

 129 |  0 |  0 MySQL数据库

孤音 | 5周前 | MySQL数据库

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

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

 107 |  0 |  0 MySQL数据库

OOM | 6周前 | 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是完全由社区驱动的开源项目。 它提供了...

 114 |  0 |  0 MySQL数据库

孤音 | 7周前 | 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

 128 |  0 |  0 MySQL数据库

雪千寻 | 8周前 | 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

 130 |  0 |  0 MySQL数据库

女王范 | 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 有

 122 |  0 |  0 MySQL数据库

渣渣辉 | 2024-01-29 | MySQL数据库后端相关

数据脱敏的 3 种常见方案

1.SQL数据脱敏实现 MYSQL(电话号码,身份证)数据脱敏的实现 -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用,请看下面具体实现   -- CONCAT(str1,str2,…):返回结果为连接参数产生的字符串 -- LEFT(str,len):返回从字符串str 开始的len 最左字符 -- RIGHT(str,len):从字符串str 开始,返回最右len 字符   -- 电话号码脱敏sql:   SELECT mobilePhone AS 脱敏前电话号码,CONCAT(LEFT(mobilePhone,3), ' ' ) AS 脱敏后电话号码 FROM t_s_user   -- 身份证号码脱敏sql:   SELECT idcard AS 未脱敏身份证, CONCAT(LEFT(idcard,3), ' ' ,RIGHT(idcard,4)) AS 脱敏后身份证号 FROM t_s_user 2.JAVA数据脱敏实现 可参考:海强 / sensitive-plus htt

 145 |  0 |  0 MySQL数据库