1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysql...>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) mysql>ALTER TABLE `table_name` ADD...INDEX index_name ( `column` ) 4.添加FULLTEXT(全文索引) mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column...` ) 5.添加多列索引 mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
缓存就是其中之一,目前缓存基本上是用redis或者memcached。 redis和memcached的优势,劣势在哪里,这里就不细说了,各位看官自行研究。...完全可以啊,今天介绍下用aop + 注解 + redis来实现统一的缓存功能。 首先我们可以定义一个用于缓存的注解,有缓存的时间,时间的单位属性。...下面操作redis的地方都要捕获异常,防止redis连不上了,连不上就要执行业务的查询方法,不能返回空数据给用户。...@Around("execution(* com.cxytiandi.spring_redis.controller.*.*(..))") public Object around(ProceedingJoinPoint...start, methodName, key); } catch (Exception e) { logger.error("获取redis
可选的解决方案 详细内容请参考专栏的文章: MySQL 5.7新特性:Online DDL MySQL 5.5 与 以前 在 MySQL 5.5 与更老的版本中,对 Alter 操作做了较简单的实现,添加和删除列的操作使用的是...MySQL 5.6 与5.7 在 MySQL 5.6 与 5.7,官方提出 Online DDL 的功能,添加和删除列的操作从 copy 算法变成了 inplcae rebuild 算法,不再阻塞对表的写入...SET 列的定义 变更索引的类型(B 树,哈希) 使用 alter 语法重命名表 使用如下 sql 命令可以查看每个表通过 instant 算法加列前的非 instant 列的数量,如果该表没有添加过...仅支持使用 MySQL 8.0 新表空间格式的表。 不支持临时表。 包含 instant 列的表无法在旧版本的 MySQL 上使用(即物理备份无法恢复)。...总结一下 实际上快速加列的 patch 是腾讯提交给官方,然后由官方自己重新实现的特性,腾讯云数据库 MySQL 自然也集成了这个功能,使用 5.7 版本的实例,简单测试一下: mysql> CREATE
安装MySql资源 2.解压Navicat Premium_11.2.7简体中文版 根据系统版本安装对应的安装包 装完之后点击PatchNavicat.exe ?...变量值后面加分号;然后填写mysql文件夹中bin目录的地址 我这里是C:\Program Files\mysql-5.7.17-winx64\bin最后加;点击确定、确定、确定。...打开mysql文件夹 ? 打开my-default.ini ?...打开mysql文件夹,找到my.ini,文件打开。 ? 在最下面添加 skip-grant-tables,保存并关闭。 在控制台输入 net start mysql ?...打开Mysql文件夹。 找到my.ini文件。并打开。去掉最下面那句话。skip-grant-tables,保存关闭。 去掉之后的截图: ? 下次再新建Mysql连接,就需要输入刚才设置的密码了。
MySQL是支持前缀索引的,前缀索引的优势就是占用的空间小,这同时带来的损失是,可能会增加额外的记录扫描次数。...如果要使用的是邮箱登录,所以代码中一定会有这种类似的语句 select f1, f2 from tableName where email='xxx'; 如果email这个字段上没有索引的话,那这些语句就只能做全表扫描 MySQL...有以下2中方式 就是使用倒序存储,比如身份证倒序,查询的时候再用函数转一下 以及使用hash字段,在表上创建一个整数字段,来保存身份证的校验码,同时在这个字段上加索引 这两种方式对比区别 从占用的额外空间来看
平时我们要优化 mysql 查询效率的时候,最常见的就是给表加上合适的索引了,那今天就来聊聊为什么加了索引就快了呢。...mysql 索引其实就是一颗 B+ 树。...谭小谭,公众号:谭某人mysql索引为啥要选择B+树 (下) 也就是说每个表至少都有一个主键索引,而且表中所有的数据行都是存放在主键索引这个 B+ 树的叶子节点上的。...刚刚有说过,主键索引叶子节点上保存完整的整行记录值,二级索引叶子节点保存主键的值,所以上面这个表 t 的数据在 mysql 底层的存储就如下示意图。 ?...推荐文章: mysql索引为啥要选择B+树 (上) python画哆啦A梦和大雄
// MySQL 8.0 之 Online DDL快速加列 // 问题描述 前几天同事问了我一个问题:业务A从MySQL迁移到MongoDB的原因是什么?...在实际的MySQL运维过程中,我们经常会遇到业务需要给某张表添加字段的情况,那么常用的MySQL添加字段的方法有哪些呢?...这里我简单列举一下: 1、percona的pt-osc工具 2、github开源项目gh-ost工具 3、MySQL原生Online DDL 01 MySQL Online DDL加列的历史方法 01...Copy方法 MySQL5.5版本及之前的加列方法:Copy 它的执行示意图如下: 我们有一个原表A,只包含1个字段,它包含1、2、4、6这几条记录,当我们使用Copy算法加列时: 1、创建了一个新的表...02 MySQL8.0.12 引入的Instant方法 MySQL8.0.12版本引入了Instant的方法,它让加列变得更加简单。
二、关于Redis分布式锁基础知识 ? 三、Redis加解分布锁的正确姿势 ?...四、Redis分布式加锁的主要流程 产生随机数,可用UUID,存储起来,一般存储在ThreadLocal中,以便解锁用; 调用Redis 的SETNX命令将随机数当作value存入,key为taskId...(实际项目中过期时间的多少主要是取决任务估算的执行时间,一般为估算执行时间*2,如该任务的估算时间是2m,则过期就要设置4m); 如果返回ok,说明加锁成功,否则失败; 五、Redis分布式解锁的主要流程...基于Redis分布式锁的教学 ?
这里是个例子: 1356435517_94[1].png set @a=0;select @a:=@a+1,user,host from mysql.user; 这里定义了一个变量@a,并在select...中动态赋值,实现每行加一。...这个语句也可以用在update中,如: set @a=0;update table_name set col_name=@a where @a:=@a+1; 这里在mysql5有个潜规则: 如果where
我曾遇到过这么一个需求:要用 Redis 保存 5000 万个键值对,每个键值对大约是 512B,为了能快速部署并对外提供服务,我们采用云主机来运行 Redis 实例,那么,该如何选择云主机的内存容量呢...同时,我还采用 RDB 对数据做持久化,以确保 Redis 实例故障后,还能从 RDB 恢复数据。 但是,在使用的过程中,我发现,Redis 的响应有时会非常慢。...这跟 Redis 的持久化机制有关系。在使用 RDB 进行持久化时,Redis 会 fork 子进程来完成,fork 操作的用时和 Redis 的数据量是正相关的,而 fork 在执行时会阻塞主线程。...这个时候,我们注意到了 Redis 的切片集群。虽然组建切片集群比较麻烦,但是它可以保存大量数据,而且对 Redis 主线程的阻塞影响较小。...这就和接下来我要讲的 Redis Cluster 方案有关了。不过,我们要先弄明白切片集群和 Redis Cluster 的联系与区别。
report_product_sales_data_hq_code_orgz_id_index PRIMARY 4 NULL 7624 Using where 开启优化器跟踪查看MySQL... { "reconsidering_access_paths_for_index_ordering": { //到了order by id这边时,MySQL... { "reconsidering_access_paths_for_index_ordering": { //到了order by id这边时,MySQL...join_execution": { "select#": 1, "steps": [ ] } } ] } 现象及修改方案 通过现象可以看到MySQL...对于数据量比较大,而且执行量很高的分页sql,尽可能将所有的查询字段包括在索引中,同时使用索引来消除排序; 多用explain查看是否使用到了最优索引; 利用optimizer trace查看优化器执行过程; 观察mysql
report_product_sales_data_hq_code_orgz_id_index PRIMARY 4 NULL 7624 Using where 开启优化器跟踪查看MySQL...{ "reconsidering_access_paths_for_index_ordering": { //到了order by id这边时,MySQL...{ "reconsidering_access_paths_for_index_ordering": { //到了order by id这边时,MySQL...join_execution": { "select#": 1, "steps": [ ] } } ] } 现象及修改方案 通过现象可以看到MySQL...对于数据量比较大,而且执行量很高的分页sql,尽可能将所有的查询字段包括在索引中,同时使用索引来消除排序; 多用explain查看是否使用到了最优索引; 利用optimizer trace查看优化器执行过程; 观察mysql
张大胖把我 Redis 安排到这个系统中来,那就是为了提升系统的响应速度,我把数据都暂时放到了内存中,每当 Tomcat 需要的时候直接拿走就是了,都不用联系 MySQL。...缓存空值 这一次,MySQL 终于意识到了我的价值,他出了一个主意:“Redis 同学,你把那些不存在的 key 和对应的空值也缓存下来不就行了?...布隆过滤器 MySQL 说:“如果能事先得知这个 key 是不是在数据库存在就好了,可是想知道是否存在,那就得把所有的 key 都放到缓存中,Redis,你能受得了吗?” 我当然受不了。...MySQL 佩服地说:“老弟真是不错,我服了你了,以后你一定要尽可能的把流量都给挡住,别往我这里发了,实在是太可怕了!” Tomcat 补充到:“是啊,这 Redis 缓存太重要了!”...MySQL 说:“啊? 这多吓人,从今天开始,我将时时刻刻为你祈祷,上帝保佑,你千万别挂掉。” 与此同时,张大胖开始着手 Redis 集群了......
同步结果写Redis,一条一条set,每一条都是一次网络往返。下面按「查、传、写」的顺序,一个一个治。...ids"item="id"open="("separator=","close=")">#{id}有个坑我得先交代:我第一次写这个接口,一股脑把一万个用户ID全塞进IN,MySQL...四、RedisPipeline:别一条条写了RedisPipeline(管道):Redis客户端把一批命令攒在一起,一次网络往返全部发给服务端,再一次性读回所有结果。...另外三个注意点:pipeline期间连接被独占,别在管道里夹其他操作,要同时干别的就单独开一条连接;单批别塞太多,几千上万条会把Redis内存和客户端响应队列顶爆,我习惯1000条一批;命令之间有依赖(...五、三件套串起来:一次用户信息同步的完整链路批量接口、顺序消费、Redis管道不是三个孤立技巧,它们各管一段,拼起来才是完整的一条同步链路。
-v /mydata/mysql/data:/var/lib/mysql\ -v /mydata/mysql/conf:/etc/mysql\ -v /mydata/mysql/log:/...var/log/mysql\ -e MYSQL_ROOT_PASSWORD=root\ -p 3306:3306 -d mysql:5.7 参数 -v /mydata/mysql/data...docker restart mysql 安装redis 拉取镜像 docker pull redis 启动redis 创建文件夹 mkdir -p /mydata/redis/conf touch...mydata/redis/conf/redis.conf:/etc/redis/redis.conf\ -d redis redis-server /etc/redis/redis.conf --privileged...mydata/redis/conf/redis.con 进入到redis控制台 docker exec -it redis redis-cli 开启redis持久化 vim /mydata/redis
Redis和MySQL都是非常流行的开源数据库,各自有其独特的用途和优点。Redis是一个基于内存的键值存储系统,适用于缓存和高速读取操作。...Redis与MySQL集成Redis和MySQL之间的集成可以通过将Redis用作MySQL查询的缓存来实现。在这种集成中,MySQL仍然是主要的持久性存储,并且数据仍然保存在MySQL中。...但是,Redis可以在查询MySQL之前查找缓存,从而减少查询MySQL的次数并加速查询响应时间。下面是一个简单的示例,演示如何将Redis用作MySQL查询的缓存。...1.首先,我们需要安装和配置Redis和MySQL。我们可以使用适合自己的操作系统和版本。这里我们不再赘述。2.我们还需要一个用于执行MySQL查询的客户端。...我们可以在下次查询MySQL之前,检查Redis中是否有该查询的缓存结果。如果是,则可以从Redis中获取结果,而不需要再次查询MySQL。
某天开发火急火燎找来,说是给表加字段时,出现 ERROR 1062 (23000):Duplicate entry …… key …… 报错,怀疑是 MySQL 出了问题。...我正准备大肆谴责开发,字打完一半才发现逻辑有些不通, 疑点:如果是新增字段,怎么会报数据重复(又不是给字段加唯一索引)?...生产环境能给大家看的就只有这么多了,但相信对各位 “彦祖” 来说足够看出问题了: 这就是个普通的加字段操作 加的字段和报重复值的字段不一样 但对我来说,乍一看就只看到了 duplicate key,第一反应就是看该字段是否有重复值...# 新增字段 mysql> alter table sbtest1 add column home varchar(); # 插入数据 mysql> insert into sbtest1(id,k)...id=76895 本文关键字:#MySQL #DDL #报错
本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1. 是否已经加锁? 一个事务,在执行过程中,可能多次操作同一个表。...每次加表锁之前,如果 InnoDB 判断事务已经对这个表加了相同或者更高级别的表锁,就不会执行本次加表锁操作了。 以事务 T1 读取某个表的多条记录,并且需要加行级别的共享锁为例。...每次加表级别的意向共享锁之前,如果 InnoDB 判断事务 T1 已经给这个表加了表级别的意向共享锁、意向排他锁、共享锁、排他锁中的一个,就不会执行本次加表锁操作了。...如果是表锁结构,但是它对应的表不是本次要加表锁的表,不会阻塞本次加表锁操作,也直接忽略,不做任何处理。 否则,判断这个锁结构对应的表锁,和本次要加的表锁相比,级别相同还是更强。...换句话说,也就是要判断是否有其它事务已经获得并持有的表锁,和本次要加的表锁不兼容,从而阻塞本次加表锁。
在最近的性能测试中,某一个查询接口指标不通过,开发做了N次优化,最终的优化方案如下:异步查询然后转同步,再加上redis缓存。此为背景。...原因在于往redis里面放置信息的时机不对,大概是由于写代码太着急,正确的做法应该是在异步转同步以后再去操作redis。...InterruptedException e) { logger.error("异步处理线程异常", e); } } BUG的原因也比较简单,由于第一次查询的时候redis...里面内容时空的,所以走了数据库查询,查询到结果后,放到redis里面,但是在存redis时候,异步的查询任务并没有完成,导致第一次请求得多的响应是对的,但是redis里面存放的却是错误的。
go这些基础的东西,看起来很舒服,最起码对于写习惯java的人来讲,go真的很舒服,所以近一段时间可能一直连更,gin并没有直接封装操作MySQL的工具类,所以还是使用开源的工具 github.com/...garyburd/redigo v1.6.2 github.com/go-sql-driver/mysql v1.5.0 github.com/jmoiron/sqlx v1.2.0 go操作mysql...确实差一点,但是对比JDBC的话,go可就好太多了 这里的话,新建util.go用于获取数据库连接,将路由、功能、工具区分开 var Db *sqlx.DB func Init() { // 获取 MySQL...链接需要自己导入 _ "github.com/go-sql-driver/mysql" database, err := sqlx.Open("mysql", "root:Root5683@@tcp...的连接显得有些麻烦,不可能每次使用都去连接一次,如果想像操作mysql一样只获取一次,然后直接可以在别得地方调用,那就很舒服,所以,可以借用redis连接池 redis连接池 获取redis连接池,这个我们同样在