数据库
文章平均质量分 68
自由de单车
90后程序猿
展开
-
【Redis】解决List类型的消息可靠性问题
平时做后端开发时,如果需要用到消息队列功能,但公司的IT环境又没有提供专业的队列软件(RabitMQ/Kafka…),那么在简单场景下,可以使用 Redis 的List数据类型来做消息队列。但List类型有一个挺致命的缺点,就是消息可靠性。当消费者使用命令从队列中取出一条消息后,如果消费者在消费完成前崩溃了,那么这条消息就永远丢失找不回来了。注:为了方便理解,下文统一以“左进右出”的 List 作为例子。原创 2024-04-03 21:06:17 · 598 阅读 · 0 评论 -
【MySQL】LEFT JOIN表时条件的位置对查询结果的影响
我们知道,JOIN表的查询条件可以放在JOIN语句处,也可以放在 WHERE 语句处。用这条件举例:方式1:放在 WHERE 语句处方式2:放在 JOIN 语句处平时做开发我基本都是用 方式1,而 方式2 就较少使用,可能会有人像我一样,觉得这两种方式的查询结果是一样的,但其实不是的。原创 2024-03-15 16:38:49 · 515 阅读 · 0 评论 -
【最佳实践指南】在ClickHouse中更新和删除数据
对于一个分析型数据库而言,更新和删除数据是有挑战的,它会显著影响数据库的性能。为了解决这个问题,ClickHouse为不同场景提供了不同的高效更新和删除数据方式:Lightweight删除,通过语句从ClickHouse里删除数据。这是删除数据最高效的方式,适合无需立即释放磁盘空间、允许数据继续存留在磁盘上的场景;Mutation删除,通过语句删除。适合需要立即释放磁盘空间的场景。例如,合规要求需要确保数据从磁盘上删除。Mutation更新,通过语句更新。适合不会频繁更新数据的场景使用TTLs。翻译 2024-03-08 22:00:06 · 8199 阅读 · 2 评论 -
为什么SQL预编译可以防止SQL注入攻击
防范SQL注入攻击是每一位做后端开发的程序员必须会的基本功。本文介绍其中一种防范攻击的方法:SQL预编译。原创 2023-09-27 17:40:45 · 549 阅读 · 0 评论 -
[翻译文]MySQL在SSD中使用更小的innodb_page_size有助提高性能
在这篇文章中,我们将讲述在SSD设备下,一个更小的innodb_page_size是怎么提高MySQL性能的。在我之前写的一篇文章中,我对比和测试了不同的三星SSD设备。大部分SSD使用4KB作为内部页的大小,而innodb存储引擎的默认页大小是16KB。我想知道不同的innodb_page_size是否会影响数据库的性能。幸运的是,MySQL 5.7新增了一个innodb_page_size配置项,从而让你可以自定义innodb的页大小,然而这个配置项目前使用起来还不是很方便。你不能改变一个已有的数据翻译 2022-02-21 22:09:21 · 579 阅读 · 0 评论 -
redis过期key的删除策略
前言在使用redis的过程中,不免会产生过期的key,而这些key过期后并不会实时地马上被删除,当这些key数量累积越来越多,就会占用很多内存,因此在redis底层同时使用了三种策略来删除这些key。第一种策略:被动删除当读/写一个key时,redis首先会检查这个key是否存在,如果存在且已过期,则直接删除这个key并返回nil给客户端。第二种策略:定期删除redis中有一系列的定期任务(serverCron),这些任务每隔一段时间就会运行一次,其中就包含清理过期key的任务,运行频率由配置文件原创 2022-02-17 14:22:38 · 7737 阅读 · 0 评论 -
MySQL参数优化总结
innodb_io_capacity描述:此参数用于控制InnoDB引擎刷脏页的速度,数据变更只记录到内存还未写入到磁盘的数据页称为脏页;把内存页数据写入到磁盘的过程,称为刷脏页(flush)。若刷脏页速度太快超过磁盘的IO写入能力,或者磁盘IO能力很高但刷脏页速度设置得太低,都会影响数据库的性能。默认值:200建议值:设置成磁盘的 IOPS,磁盘的 IOPS 可以通过 fio 这个工具来测试,命令:fio -filename=$filename -direct=1 -iodepth 1 -t原创 2021-11-09 18:07:11 · 666 阅读 · 0 评论 -
禁止navicat通过SSH通道功能连接内网里的数据库
前言目前公司有一台 Linux应用服务器 和 MySQL数据库,数据库处于内网中,没有外网IP;应用服务器有对外网开放80端口和22端口,用于给用户提供web服务和给运维/开发人员提供SSH登录服务。架构如下:存在的问题为了数据库的安全,不将数据库暴露在外网是正确的,而应用服务器上也没有安装MySQL client工具,即使开发人员SSH登录到应用服务器,也不能通过shell登录到数据库对数据进行增删改,在应用服务器上,只能通过代码的形式去连接。但这样就安全了吗?并不是,开发人员还可以在他们的本地原创 2021-11-04 11:32:05 · 771 阅读 · 0 评论 -
MySQL自增主键值回溯问题
平时我们使用MySQL时,通常每一个表都会有一个自增主键ID,每新增一条数据,ID值就会自增1。但在8.0之前版本的MySQL中,这个自增值会存在一个回溯的问题。例如,在一个新表中插入三条主键为1、2、3的数据行,这时候用SHOW CREATE TABLE命令查看该表的AUTO_INCREMENT的值是4,这是没问题的。然后把ID=3的数据行删掉,再次查询AUTO_INCREMENT的值,依然是4,这也是没问题的。但如果重启一下MySQL,这个值就会变回3,而不是4,发生了回溯。这是因为AUTO_I原创 2021-06-16 23:55:31 · 1563 阅读 · 3 评论 -
聊聊MySQL的varchar类型
计算varchar列的长度varchar类型除了存储字符串本身以外,还需要1~2个字节来存储字符串的长度信息(字符串长度小于或等于255字节时需要1字节,超过则需要2字节);另外,如果设置允许NULL的话,会再需要多1字节空间。假设有一个varchar(32)字段,字符集是utf8,允许NULL,因为每个utf8字符最多占用3个字节,存储字符串本身需要占用的空间是:32 * 3 = 96字节96字节小于255,所以这一列的最大长度是:96 + 1(存储长度信息的额外1字节) + 1(允许NULL的1原创 2021-06-15 22:25:51 · 2796 阅读 · 1 评论 -
MySQL整数类型字段的显示宽度
前言在MySQL中定义整数类型字段(tinyint、smallint、mediumint、bigint)时,可以指定显示宽度(display width),例如int(1)、int(3)。如果定义字段时没有指定显示宽度,会以该类型能存储的最大值长度来作为默认值,例如int类型在默认情况下能存储的最大值是2147483647,总共10个数字,因此int的默认显示宽度是10,显示宽度最大值能设置为255。需要注意的是,这个显示宽度跟该数据类型的取值范围、存储空间无关,无论设置成多少,int类型的存储空间都原创 2021-06-10 17:22:00 · 2350 阅读 · 0 评论 -
MySQL不使用索引的原因总结
前言有时候在MySQL上执行查询时,即使WHERE条件中涉及的字段已经建立了索引,但MySQL仍然没有使用到该索引,下面针对各种可能的原因进行总结。环境下文中说到的原因均已在MySQL 5.7.21中进行验证测试。可能的原因1)where中的字段涉及隐式数据类型转换users表的a字段建有索引,数据类型为varcharSELECT * FROM users WHERE a = 1上述语句不会使用到a字段的索引,因为a字段的数据类型是varchar,而SQL中的WHERE条件是a=1,涉及到原创 2021-05-29 22:11:08 · 1600 阅读 · 0 评论 -
MySQL主从延迟的原因总结
怎么判断主从延迟在从库上执行SHOW SLAVE STATUS,如果结果里的seconds_behind_master字段不等于0,则代表主从有延迟,值越大延迟越大。可能的原因及解决方案1)网络抖动网络抖动导致主库的binlog没能及时传给从库解决方案:先把从库上的查询切到主库,等网络恢复后再切回从库2)从库机型配置比主库差从库配置差性能低,导致从库消费relay log的速度比主库生成binlog的速度慢解决方案:换成同等机型3)从库压力大有人在从库上执行十分消耗性能的SQL查询语原创 2021-05-29 21:15:35 · 1441 阅读 · 2 评论 -
MySQL使用GROUP BY分组时如何留下指定的行
前言假设有一个存储文章信息的数据表(article),结构如下:字段名说明id主键IDauthor_id作者IDtitle文章标题content文章内容add_time文章添加时间edit_time文章上一次编辑时间作者和文章是一对多的关系,现在需要从这个表里查出每个作者最近编辑过的一篇文章,那么可以怎么写SQL语句呢?分析这个查询有两个条件:每个作者仅需展示一篇文章展示的文章是最新编辑过的那一篇针对第一个条件,可以使用G原创 2020-12-23 14:47:46 · 6120 阅读 · 1 评论 -
MySQL慢查询:SHOW TABLE STATUS
前言最近线上的一台MySQL服务器开启了慢查询日志功能,开启后,发现有一部分命令是SHOW TABLE STATUS,查询时间长达十几秒,一个普通命令居然执行了这么长的时间,于是进行调查。调查原因上网搜索资料,发现是innodb_stats_on_metadata这个配置项导致的,我们MySQL使用的是比较老旧的5.5版本,这个配置默认开启(5.6之后的版本默认关闭)。如果这配置开启,当使用SHOW TABLE STATUS、SHOW INDEX命令,或者查询INFORMATION_SCHEMA.T原创 2020-12-14 12:03:04 · 813 阅读 · 0 评论 -
PHP进程卡死和MySQL超时时间的设置方法
前言最近线上一台服务器的nginx每隔几分钟就会有几个请求(不是所有请求)报upstream timed out (110: Connection timed out) while connecting to upstream的错误,看起来像是后端的phpcgi进程出问题了,但如果phpcgi进程有问题,不是应该所有请求都会报错才对么,于是展开排查。查找原因在我们服务器上,phpcgi是使用9000端口进行监听的,执行sudo netstat -an | grep 9000命令查看相关进程的网络状态原创 2020-11-18 16:09:17 · 1101 阅读 · 2 评论 -
Ubuntu磁盘空间爆满后输入命令报No space left on device
最近线上一台Linux服务器磁盘空间爆了,扩容完毕后,发现在命令行界面敲tab键补全命令的时候,Linux会提示:cannot create temp file for here-document: No space left on device然后使用df -h命令查看磁盘使用情况,发现多了一个overflow的文件系统,挂载目录是/tmp网上查资料,说可以使用sudo umount -l /tmp命令来解决,执行后也确实解决了报错的问题,至此问题解决。...原创 2020-10-30 14:57:26 · 2828 阅读 · 0 评论 -
mysql中优化sql语句查询的30种方法
分享一下工作中总结的 mysql 中优化 sql 语句查询的30种方法。1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中使用!=或3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from转载 2014-04-29 10:55:35 · 637 阅读 · 0 评论 -
如何向mysql中插入大量数据
有时为了做性能测试,需要向mysql中插入大量的测试用数据,以下介绍原创 2014-08-12 22:42:38 · 5162 阅读 · 1 评论 -
CentOS以源码方式安装MySQL
系统环境CentOS 6.5 64位MySQL 5.6.23安装基础组件yum -y install cmake ncurses-devel创建用户和组groupadd mysqluseradd mysql -g mysql -s /bin/false -M创建数据目录和配置文件目录#创建数据库数据存储目录mkdir -p /data/mysql#创建配置原创 2015-03-15 14:18:59 · 513 阅读 · 0 评论 -
MySQL查询优化之COUNT()
COUNT()聚合函数,以及如何优化使用了该函数的查询,很可能是MySQL中最容易被误解的前10个话题之一,在网上随便搜索一下就能看到很多错误的理解,可能比我们想象的多得多。在做优化之前,先来看看COUNT()函数的真正作用是什么。COUNT()的作用COUNT()是一个特殊的函数,有两种非常不同的作用:它可以统计某个列值的数量,也可以统计行数。在统计列值时要求列值时非空的(不统计NULL)。如果在转载 2015-08-02 17:14:58 · 6921 阅读 · 0 评论 -
MySQL中的<=>比较运算符
在MySQL查询语句中,如果想筛选出特定的记录,一般都使用=比较运算符,例如:SELECT * FROM users WHERE name = '张三'但当需要筛选出name等于NULL的记录时,就不能使用=了:SELECT * FROM users WHERE name = NULL如果查询语句这样写,是查不出任何东西的,因为跟NULL比较基本上都没有意义。那么查询语句应该怎样写呢? 1)第一种原创 2016-01-03 10:47:51 · 1030 阅读 · 0 评论 -
MySQL时间戳转日期
使用FROM_UNIXTIME函数,具体如下: FROM_UNIXTIME(unix_timestamp,format) 返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。下列修饰符可以被用在format字符串中: %M 月名字(January……December) %W 星期名字(Sunda原创 2016-04-06 12:01:27 · 1865 阅读 · 0 评论 -
MySQL按拼音首字母排序
若数据表tbl的某字段name的字符编码是utf8_general_ciSELECT name FROM `tbl` WHERE 1 ORDER BY CONVERT(name USING gbk) COLLATE gbk_chinese_ci ASC以上内容转载自:http://blog.csdn.net/zhichao2001/article/details/11721325转载 2017-04-12 14:01:08 · 693 阅读 · 0 评论 -
说说redis里面集合(Set)的排序问题
刚开始学习redis的时候,以为集合(Set)类型里面的元素总是无序排列的,其实不是的,在特定情况下,它也可以做到有序排列。在redis里,集合的编码有两种,intset(整数集合)或者hashtable(哈希表)。intset编码的集合里面的元素是有序的(按照整数从小到大排列),hashtable编码的集合是无序的。当集合同时满足下面两个条件时,会使用intset编码:保存的所有元...原创 2018-05-19 17:54:06 · 6980 阅读 · 0 评论 -
聊一聊MySQL里的锁和MVCC
在一个高并发的数据库系统里,可能会遇到多个事务同一时刻修改某条数据的情况,这样就产生了资源冲突,解决冲突就需要用到锁。一、锁一说到锁,就可能会联想到乐观锁、悲观锁、共享锁(读锁)、排他锁(互斥锁/写锁)、行级锁、表级锁 等一堆名词,那它们之间到底有什么区别和联系呢?其实很简单,乐观锁和悲观锁是一种加锁的思想;行级锁和表级锁是锁的粒度,表示加锁的范围;而共享锁和排他锁才是真正的锁,用来锁住数...原创 2018-05-20 16:27:21 · 5724 阅读 · 3 评论 -
PHP扩展redis使用手册
【key】方法:EXISTS($key)说明:检查某个key是否存在,存在返回true,不存在返回false方法:DEL($key)说明:删除一个key,返回删除的个数(整形)方法:EXPIRE($key, $seconds);说明:为某个key设置生存时间,单位为秒,设置成功返回true,失败返回false,比如key不存在的时候【stri原创 2014-04-03 15:22:07 · 883 阅读 · 0 评论