![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mysql
文章平均质量分 78
YZF_Kevin
若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒
展开
-
彻底理解数据库外键
彻底理解数据库外键转载 2023-03-07 11:42:16 · 3907 阅读 · 0 评论 -
脏读 不可重复读 幻读
脏读,不可重复读,幻读转载 2023-03-06 21:39:31 · 70 阅读 · 0 评论 -
如何理解事务的一致性?
就拿那个老掉牙的AB转账来进一步解释,如果说AB两账户总金额5000就是数据库的一致性规则,那么我能不能把A账户转走10000给B,让B账户有10000,而A剩下-5000?于是继续百度之,有人用AB转账举例,AB两个账户总共5000元,不论怎么A怎么给B转,B怎么给A转,AB账户合计总额还是5000.这就是一致性。两笔转账都执行成功了,理论上A的余额为0,但实际上A的余额被请求2修改为99元,数据的一致性被破坏了!在这个场景下,A实际转账成功了1元,但是A的余额最终为0,数据的一致性又被破坏了!转载 2023-03-06 20:53:04 · 595 阅读 · 1 评论 -
MySQL最全锁详解:行锁、表锁、悲观锁、乐观锁、共享锁
就像这样,你家有一个大门,大门的钥匙有好几把,你有一把,你女朋友有一把,你们都可能通过这把钥匙进入你们家,这个就是所谓的共享锁。第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在。转载 2023-03-06 20:33:39 · 435 阅读 · 0 评论 -
mysql之innodb存储原理
前言大家都知道 MySQL 的数据都是保存在磁盘的,那具体是保存在哪个文件呢?MySQL 存储的行为是由存储引擎实现的,MySQL 支持多种存储引擎,不同的存储引擎保存的文件自然也不同。InnoDB 是我们常用的存储引擎,也是 MySQL 默认的存储引擎。本文主要以 InnoDB 存储引擎展开讨论。InnoDB简介InnoDB是一个将表中的数据存储到磁盘上的存储引擎。转载 2023-02-23 21:21:35 · 718 阅读 · 0 评论 -
mysql的NULL值是怎么存放的
Compact 行格式针对行溢出的处理是这样的:当发生行溢出时,在记录的真实数据处只会保存该列的一部分数据,而把剩余的数据放在「溢出页」中,然后真实数据处用 20 字节存储指向溢出页的地址,从而可以找到剩余数据所在的页。如果一个数据页存不了一条记录,InnoDB 存储引擎会自动将溢出的数据存放到「溢出页」中。这个设计是有想法的,主要是因为「记录头信息」中指向下一个记录的指针,指向的是下一条记录的「记录头信息」和「真实数据」之间的位置,这样的好处是向左读就是记录头信息,向右读就是真实数据,比较方便。转载 2023-02-21 21:45:12 · 351 阅读 · 0 评论 -
Mysql 索引基数与选择性
索引的可选择性好与坏,和索引基数关系非常密切。基数值越高,索引的可选择性越好;相反,基数越低,索引的可选择性越差。优化器优先使用的索引一般选择性都不差,除非没得选,才会走选择性稍差点的索引或者走全表扫描。MYSQL 如何使用索引?之所周知,MYSQL 优化器使用的是基于成本的模型。而衡量成本的主要指标就是一个查询需要扫描多少行。如果表没有索引统计信息,或者索引统计信息不准确,优化器就很有可能做出错误的决定。统计信息不准确的问题可以通过 ANALYZE TABLE 来重新生成统计信息解决。转载 2022-12-28 22:52:22 · 1260 阅读 · 0 评论 -
MySQL 数据库平滑扩容方案剖析 - 第二篇
再回顾一下方案一,问题就在于需要停服一段时间,如果我们不停服,只是停止写数据库,期间服务器以只读的方式维持有限服务,用户可以登陆,可以查看自己的数据,可以参与任何的非DB写入性活动,那也是一种不错的办法。我们介绍了mysql扩容时的问题,以及解决方案,需经历停服,增加库,迁移分发数据,重新开服后才能恢复服务,大大影响用户体验。为了进行数据的重新拆分,我们需要提前通知用户,比如:我们的服务会在 yyyy-MM-dd 进行升级,期间不可进行某些操作,给您带来的不便敬请谅解。3. 增加新的数据库节点。转载 2022-12-20 11:43:21 · 250 阅读 · 0 评论 -
MySQL 数据库平滑扩容方案剖析 - 第四篇
1. 由于旧的主库一直在进行CURD,从库不可能完全和主库一致,所以需从库和主库完全同步结束时才能升级成主库,也就是说需要主库停止写入一段时间,办法可以是停服一小段时间,也可以是开启主库只读一段时间2. 三个小步骤:从库升级为主库;逻辑层把哈希算法从取余N变成取余2N;为2N个主库再配置一个从库;这个三个小步骤要全部完成后才算是彻底完成数据库升级,服务器才能继续提供服务3. 此种方案需要随时有相同个数的从库。转载 2022-12-15 19:38:31 · 302 阅读 · 0 评论 -
MySQL 数据库平滑扩容方案剖析 - 第三篇
由于旧DB一直在进行CURD,一直有日志产生,即便通过上面的数据校验处理, 但不能保障完全一致,这个时候可以在旧库做一个 readonly 只读功能,等待日志增量同步工具完全追平后, 再进行新库的切换。至此,完成日志方案的迁移扩容处理, 整个过程能够持续对线上提供服务, 只会短暂的影响服务的可用性。这种方案的弊端,是操作繁琐,需要适配多个同步处理工具,成本较高, 需要制定个性化业务的同步处理, 不具备普遍性,耗费的时间周期也较长。转载 2022-11-29 19:34:21 · 356 阅读 · 0 评论 -
mysql报错 “Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated“的解决办法
完整报错内容:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'a.logid' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by如下图所示 提示得也很清楚 使用 GROUP BY 语句原创 2022-07-01 18:34:18 · 338 阅读 · 0 评论 -
MySQL清空表的各种方法
一、MySQL清空表数据命令:truncateSQL语法:truncate table 表名注意:不能与where一起使用。truncate删除数据后是不可以rollback的。truncate删除数据后会重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的ID数。truncate删除数据后不写服务器log,整体删除速度快。truncate删除数据后不激活trigger(触发器)。二、MySQL删除表命令:dropSQL语法:drop t转载 2022-06-17 09:47:10 · 172 阅读 · 0 评论 -
mysqldump导出部分数据
总结1. 导出指定库(ph_game_fight即库名)2. 导出指定库,指定表(ph_game_fight即库名,fight_0即表名)3. 导出指定库,指定表,指定where条件4. 导出指定库, 指定表,指定多行导出(默认只有一行insert语言,会很大)......原创 2022-06-07 11:33:07 · 1422 阅读 · 0 评论 -
centos安装mysql8.0
准备安装包1. 打开mysql的官网,MySQL :: Download MySQL Community Server如下图2. 选择对应的版本,CentOS 是基于红帽的,Select OS Version: 选择 linux 7,如下图3. 下载完安装包后,传到要安装的centos电脑上,笔者是放在了目录:/usr/local/mysql,如下图安装步骤如下1. 运行命令rpm -qa | grep mariadb ,查看是否安装了mariadb...原创 2021-12-07 11:09:14 · 1296 阅读 · 0 评论 -
记一种数据库水平扩展的技巧
起因这段时间我们游戏在持续推广,每天数万的玩家注册,服务器压力增加得很快。虽然我们服务器进程可以多开,redis用的是集群版,也可以水平扩展,但数据库不是,一直是只有一个数据库在支撑。即便大部分玩家数据都存放在redis中,只有redis中的数据过期后才会去请求数据库进行查询,但一定顶不住人多啊,现在每天日活跃玩家将近20万,同时在线接近2万,数据库压力还是很大,所以扩展成多个数据库是唯一选择思考原来只有一个数据库,现在要扩展多个数据库,同时还要兼容原来的玩家,依然能正确读取,更新其旧数据,不能原创 2021-08-26 21:41:45 · 224 阅读 · 0 评论 -
Multi-Range Read (MRR)原理
Multi-Range Read (MRR)MRR的全称是Multi-Range Read Optimization,是优化器将随机IO转化为顺序IO以降低查询过程中IO开销的一种手段,这对IO-bound类型的SQL语句性能带来极大的提升,适用于range ref eq_ref类型的查询MRR优化的几个好处使数据访问有随机变为顺序,查询辅助索引是,首先把查询结果按照主键进行排序,按照主键的顺序进行书签查找减少缓冲池中页被替换的次数批量处理对键值的操作在没有使用MRR...转载 2021-07-27 18:35:25 · 793 阅读 · 0 评论 -
mysql ICP优化的原理
概述今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解。一、Index Condition PushdownIndex Condition Pushdown (ICP)是MySQL用索引去表里取数据的一种优化。如果禁用ICP,引擎层会穿过索引在基表中寻找数据行,然后返回给MySQL Server层,再去为这些数据行进行WHERE后的条件的过滤。ICP启用,如果部分WHERE条件能使用索引中的字段,MySQL Server 会把这部分下推到引擎层.转载 2021-07-27 17:57:59 · 525 阅读 · 0 评论 -
mysql ICP优化的原理
MySQL ICP(Index Condition Pushdown)特性一、SQL的where条件提取规则在ICP(Index Condition Pushdown,索引条件下推)特性之前,必须先搞明白根据何登成大神总结出一套放置于所有SQL语句而皆准的where查询条件的提取规则:所有SQL的where条件,均可归纳为3大类:Index Key (First Key & Last Key),Index Filter,Table Filter。接下来,简单说一下这3大类分别是如何定义,转载 2021-07-27 17:41:44 · 379 阅读 · 0 评论 -
SQL_CALC_FOUND_ROWS的用法
我们在分页程序中往往这样写SELECT COUNT(*) from `table` WHERE xxxxxx; // 查出符合条件的记录总数SELECT * FROM `table` WHERE xxxxxx limit M,N; // 查询当页要显示的数据这种先统计总数,再统计分页的做法可以替换为下面的写法SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE xxxxxx limit M, N; // 获取指定页的数据,且统计总条数其中的原创 2021-07-26 16:58:05 · 7170 阅读 · 0 评论 -
浅析多个单列索引和联合索引的区别
1.创建表格 TABLE IF EXISTS `t_mobilesms_11`; CREATE TABLE `t_mobilesms_11` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `userId` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户id,创建任务时的userid', `mobile` var转载 2021-07-15 19:28:21 · 145 阅读 · 0 评论 -
mysql之慢查询详解,mysqldumpslow的使用
简言1. mysql中的慢查询是我们分析问题,定位问题的利器,巧妙使用可以快速解决问题2. 原理:运行时间超过 long_query_time 的sql语句会被写入到慢查询日志文件中或者mysql.slow_log表中,long_query_time的默认值是10s3. 还可以使用慢日志分析工具 mysqldumpslow 来进行分析慢查询相关参数slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。log-slow-queries :旧版(5.6以下版...原创 2021-02-23 20:07:24 · 3095 阅读 · 0 评论 -
mysql添加用户,设置权限,回收权限,删除用户详解
简言1. mysql的用户信息,权限管理等很简单,在数据库mysql的表user中可以查询,操作示例1. 创建用户,带密码,同时限制登录IP模板:create user '新用户名'@'localhost' identified by '密码';示例:(第一句是创建用户moveLog,密码是12348765,限定只能从192.168.130.115的IP登录,第二句是查看权限,此时只有USAGE的权限,这个权限是创建用户时自带的,只能登录,改自己的密码,其他的几乎什么都干不了).原创 2020-11-24 18:54:53 · 2105 阅读 · 0 评论 -
mysql打开sql语句日志
简言1. 昨天线上服务器mysql的cpu使用飙升到400%,且一直持续,修改了可能导致问题的地方,比如加索引,优化慢查询,然并卵,照旧2. 后来网上查了下,可以打开sql语句日志,看下mysql到底卡在什么地方,才最终定位到问题步骤如下1. 终端上使用命令连接进mysql(笔者这里的mysql是3305端口,默认情况mysql是3306端口)2. 查看所有变量general,可以看到general_log是关闭的3. set global general_log = 1;原创 2020-11-17 18:10:48 · 991 阅读 · 0 评论 -
MySQL max_allowed_packet设置及问题
根据配置文件会限制server接受的数据包大小。有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。查看目前配置show VARIABLES like '%max_allowed_packet%';修改方法可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改。在[mysqld...转载 2020-04-26 21:11:01 · 179 阅读 · 0 评论 -
ubuntu16安装mysql8.0
步骤1:下载deb包wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb步骤2:安装该deb包sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb运行后会弹出下面的界面,选择OK即可步骤3:更新系统安装源sudo apt-get update步骤...原创 2020-03-28 00:12:03 · 2470 阅读 · 0 评论 -
win7安装mysql5.8
环境:win7 64位mysql版本:mysql-8.0.19步骤1:下载mysql5.8安装包步骤2:解压到目录步骤3:添加配置文件my.ini,内容如下步骤4:如下图...原创 2020-02-14 15:24:30 · 428 阅读 · 0 评论 -
c/c++操作mysql数据库使用utf8总结
简言1. 现在编程时为了统一中英文,各国语言版本兼容性,我们都使用utf8格式存储字符串2. mysql保存字符数据时若出现了乱码,例如中文乱码,可以确定是字符集的问题,建议统一改为utf83.c/c++语言操作mysql时,使用utf8编码也有很多注意要点,这里笔者做个简单的总结,避免大家踩坑三个步骤1. 确保mysql数据库是utf8格式,数据库的表也是utf...原创 2020-01-13 20:05:01 · 1132 阅读 · 0 评论 -
C/C++ mysql 设置字符集
mysql在C/C++中调用api设置连接mysql的编码方式有以下几种方法:1. mysql_set_charset调用示例:[cpp]ret = mysql_set_character_set(mysql, "utf8");说明:推荐使用的设置方法,与mysql的连接断开自动重连后仍能保持设置的编码格式,并且影响mysql_real_escape_string函数功能,使my...转载 2020-01-11 16:54:28 · 1371 阅读 · 0 评论 -
mysql 给列增加索引
优点:可能有人知道索引的作用的是什么,例如知道索引可以提高查询效率,减少查询时编列全表,或者说,有了索引可按特定的序列进行排序等等。还可以加快表与表之间的连接。在使用分组和排序子句进行数据检索时,可以显著的减少查询的时间。缺点:创建了索引,当然就需要我们去维护索引了,维护是需要时间,随着索引的增加而增加。索引还会占用物理空间,我们数据库的数据表是占用物理空间,索引也是要占用一定的空间,而且...转载 2019-07-26 17:38:52 · 3900 阅读 · 0 评论 -
sql语句 where 后条件执行先后顺序
结论如下:1. 针对mysql,其条件执行顺序是 从左往右,自上而下2. 针对orcale,其条件执行顺序是从右往左,自下而上mysqlwhere执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,此时应遵守一个原则:排除越多的条件放在第一个在用MySQL查询数据库的时候,连接了很多个过滤条件,发现非常慢。例如:SELECT … WH...转载 2019-04-23 15:12:00 · 38573 阅读 · 4 评论 -
mysql使用某一列的内容赋值给另外一列,concat()函数
关键函数:concat(str1,str2,…)描述:连接字符串函数,返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL。如果参数是数字,则自动转换为字符串示例:数据库表t_player的格式如下图目的:我们要修改列nickname的值为Tourist+列showUID的格式办法:update t_player set nickname = co...原创 2019-04-11 15:00:04 · 3290 阅读 · 0 评论 -
MySQL 4种text类型的最大长度
MySQL 4种text类型的最大长度如下TINYTEXT 256 bytes TEXT 65,535 bytes ~64kb MEDIUMTEXT 16,777,215 bytes ~16MB LONGTEXT 4,294,967,295 bytes ~4GB转载 2019-03-27 17:12:11 · 7501 阅读 · 1 评论