MySQL
文章平均质量分 86
MySQL
AirGo.
[WHY]每一个你不满意的当下,都有一个你不曾努力的过去。
展开
-
MySQL源码调试,一条最简单的select语句是如何执行的?
码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071,或关注公众号:程序猿AirGo注意:我们当前是以8.0.18为准,调试时需要注意版本对应的行数问题。安装MySQL1、下载linux通用源码:wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.18.tar.gz2、解压压缩包:tar -zxvf mysql-8.0.18.tar.gz3、安装依赖工具:yum/brew ...原创 2021-08-22 20:09:36 · 1783 阅读 · 0 评论 -
MySQL效率提升大杀器 — Change Buffer
目录为何慢Change Buffer处理流程InsertDeleteUpdate内部实现非叶子节点Insert Buffer BitmapMerge处理辅助索引被读取辅助索引页已无可用空间Master Thread 定时 Merge相关配置innodb_change_buffer_max_sizeinnodb_change_buffering适用场景为何慢 大家在面试中应该都会遇到这样一个问题:索引建多了有什么坏处?相...原创 2021-07-06 12:42:45 · 717 阅读 · 1 评论 -
搞懂这些,让MySQL性能监控和优化事半功倍
有多少人关注过自己MySQL性能?你现在的MySQL已经优化到极致了么?如何发现自己的MySQL性能问题?DROP TABLE IF EXISTS `hq_price`;CREATE TABLE `hq_price` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增属性', `province_id` int(10) unsigned NOT NULL COMMENT '省id', `city_id` i.原创 2020-11-18 12:54:51 · 1256 阅读 · 0 评论 -
MySQL是如何实现事务ACID四个特性的?
事务的实现要了解事务是如何实现的,必须要先了解4个概念:redolog undolog purge group commit下面将分别介绍。redolog重做日志用来实现事务的原子性和持久性,主要需要关注下面几个概念点:日志由两部分组成,一部分是内存中的重做日志缓冲(redo log buffer),是容易丢失的,另一个部分是重做日志文件(redo log file),是持久到磁盘的。 为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB引擎原创 2020-10-30 21:51:41 · 1561 阅读 · 0 评论 -
MySQL编译安装和lldb源码调试
安装MySQL1、下载linux通用源码:wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.18.tar.gz2、解压压缩包:tar -zxvf mysql-8.0.18.tar.gz3、安装依赖工具:yum install cmake gcc-c++ ncurses-devel perl-Data-Dumper boost boost-doc boost-devel git4、删除CMakeCache.txt5、.原创 2020-10-10 01:24:32 · 929 阅读 · 0 评论 -
MySQL主从复制原理、实践和常见问题
配置主从注意:需要初始化启动2个mysql实例,需独立2个mysql实例目录和配置文件,安装参考:https://success.blog.csdn.net/article/details/83660180master配置文件:[mysqld]port=3306basedir=/usr/local/mysqldatadir=/usr/local/mysql/datacharacter-set-server=utf8lower-case-table-names=2default_原创 2020-10-04 17:31:15 · 971 阅读 · 2 评论 -
关于MySQL索引和filesort原因的探究
为何要探究之前对 MySQL 的索引和文件排序有过一些了解,但是只是大概知道查询条件满足最左原则用到索引列,排序字段在用到的索引列中,就可以避免文件排序。很明显自己了解不到位,因为关于where字段和order by字段,会有很多种不同的组合场景,今天做几个实验探究下。探究过程表结构CREATE TABLE `t_price` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `customer_id` bi原创 2020-09-18 22:16:00 · 887 阅读 · 0 评论 -
很多面试官可能都不知道,mysql不满足最左原则,真的会导致索引失效吗?
前言之前很多面试都被问过联合索引不匹配最左原则失效的问题,当时一直以为只要不满足最左原则,联合索引就会失效,面试官也没有反馈过有什么问题,今天突然发现一条sql并没有遵循最左原则,但还是用到了联合索引。测试表结构:name和age字段建立联合索引查询覆盖索引命中的字段:explain select age from test where age = 2644;...原创 2020-03-28 18:34:04 · 1763 阅读 · 7 评论 -
关于mysql的事务隔离模式、快照读和当前读、MVCC,并用RC+CAS实现库存处理
声明由于贴mysql截图会占太大篇幅,影响整体阅读理解,所以没有贴mysql截图,但是下面步骤都是亲自试验过的四种隔离级别(由低到高)Read Uncommitted读未提交:可以看到其他事务未提交的内容 Read Committed读已提交:可以看到其他事务已提交读内容 Repeatable Read可重复度:事务开始时和事务结束时读到的数据完全相同 Serializable串...原创 2020-03-22 15:26:14 · 1887 阅读 · 1 评论 -
MySQL查询开销计算原理和索引失效原因
背景关于mysql索引失效的几种情况,网上有很多文章,但是大多我感觉都是抄来抄去的,也有少数附上了自己的实验结果,但是并没有剖析背后的原理,所以今天自己亲自做套实验,分析一下。准备数据CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL ...原创 2020-03-20 12:24:18 · 1729 阅读 · 6 评论 -
php连接mysql报错:SQLSTATE[HY000] [2002] No such file or directory
连接数据库报错:“SQLSTATE[HY000] [2002] No such file or directory”。 出现这个问题的原因是PDO无法找到mysql.sock或者mysqld.sock。 解决方法1:找到相应的.sock文件,并设置php.ini文件中的pdo_mysql.default_socket的值为.sock文件的路径。pdo_mysql.defa...原创 2018-10-09 12:09:01 · 22408 阅读 · 2 评论 -
关于MySQL存储IP地址引发的思考
产生思考 今天在看《高性能MySQL》时,有这么一句话,IP地址实际上是32位无符号整数,所以应该用无符号整数存储IP地址,MySQL提供了INET_ATON()和INET_NTOA()函数在这两种表示方法之间的转换。这样存的好处有两点:节省空间,32位无符号整数,即INT类型(不清楚MySQL各种类型的点这里移步),只占4个字节。 通过where比较,可以方便筛选某个地址...原创 2019-12-16 20:53:19 · 309 阅读 · 0 评论 -
MySQL各类存储类型对比
整型数据类型 存储大小 十进制范围(有无符号) TINYINT 8位,1字节 有:-128~127 无:0~255 SMALLINT 16位,2字节 有:-32768~32767 无:0~65535 MEDIUMINT 24位,3字节 有:-8388608~8388607 ...原创 2019-12-15 23:38:52 · 621 阅读 · 0 评论 -
MySQL事务代码不合理导致数据不一致
发现问题今天压测的时候,发现在并发下,发现数据出现下面的情况:数据库里有一个count字段,执行10次代码,本应该-10,结果测了几次却发现,结果总是在-7上下浮动,少减 记录count字段变动记录,没有问题,记录了10条-1记录然后仔细想了下,应该是代码写的有问题。假如我们的代码是这样的$row = Model->find($id);$count = $row-&g...原创 2019-11-27 16:54:41 · 464 阅读 · 0 评论 -
MySQL二进制日志binlog
优点和缺点通过二进制日志进行进行point-in-time的恢复 主从同步 SQL审计 会造成大概1%的性能损耗配置项max_binlog_size:单个二进制文件的最大值,默认1G,超过该值,薪文件后缀名+1binlog_cache_size:所有未提交事务的二进制日志会被写入到一个缓存中,等事务提交后才写入二进制文件,该参数控制缓冲的大小,默认32KB。每开启一个事务,My...原创 2019-11-24 22:19:04 · 276 阅读 · 0 评论 -
MySQL的InnoDB缓冲池和Checkpoint
目的解决如下问题:缩短数据库的恢复时间(如果没有checkpoint,redo日志会非常大) 缓冲池不够用时,将脏页刷新到磁盘 重做日志不可用时,刷新脏页Sharp Checkpoint发生在数据库关闭时将所有脏页刷新回磁盘,防止数据丢失,由参数innodb_fast_shutdown=1控制Fuzzy Checkpoint有四种情况:Master Thread Ch...原创 2019-11-23 23:12:03 · 645 阅读 · 0 评论 -
MySQL的InnoDB多线程
InnoDB存储引擎由多个后台线程组成,线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常的运行状态。Master Thread Master Thread主要职责: 刷新脏页到磁盘 将日志缓冲刷新到磁盘 ...原创 2019-11-23 19:38:26 · 661 阅读 · 0 评论 -
MySQL的InnoDB加锁原理和常见死锁
表索引情况id:主键索引 name:无索引 good_id:无索引 user_id:普通索引当update语句的where条件使用无索引的good_id字段时事务A更改good_id=1的字段,但提交:事务B更改good_id=2的行,发生锁等待:锁查看:结果:事务2锁等待改用有索引的user_id作为where条件’事务A:事务B:...原创 2019-11-20 01:25:32 · 2409 阅读 · 0 评论 -
MySQL死锁故障排查
死锁的故障排查涉及到3张表 INNODE_TRX INNODB_LOCKS INNODB_LOCK_WAITS 排查过程 INNODE_TRX表结构:字段名 说明 trx_id InnoDB存储引擎内部唯一事务ID trx_state 当前事务的状态 trx_started 事务的开始时间 tex_re...原创 2019-11-17 11:20:43 · 1476 阅读 · 0 评论 -
MySQL的MRR和和ICP
首先要明白辅助索引、聚簇索引、覆盖索引的概念辅助索引:只包含索引列的值和书签(主键索引值),在查找到索引列时,还需要根据书签查找响应的聚簇索引获得列值,并且数据的存储并不是有序的。 聚簇索引:按照主键排序,并且存储数据行,查询到数据可直接得到其他列的数据。 覆盖索引:查询的列都在联合索引中,不需要回表查数据。MRR(Multi-Range Read)在使用辅助索引进行查询时,查询到的...原创 2019-11-15 22:55:25 · 657 阅读 · 0 评论 -
MySQL分页优化
分页优化分为两步:1、在主键和筛选条件上按照顺序添加联合索引(查到索引就可以返回结果,不需要回磁盘)2、通过延迟关联:获取需要筛选的记录的主键和主表做连接查询(通过主键筛选出需要的记录,再去磁盘中查的时候就只需要查满足分页条件的记录)...原创 2018-10-22 14:38:46 · 415 阅读 · 0 评论 -
Mysql性能优化、Mysql参数优化、Mysql配置优化
Mysql性能优化、Mysql参数优化、Mysql配置优化。Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能的得到最佳的效果Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能的得到最佳的效果为了测试我们创建一个test1的库创建一个t...原创 2018-10-08 08:53:53 · 6284 阅读 · 1 评论 -
覆盖索引有何用?
通常开发人员会根据查询的where条件来创建合适的索引,但是优秀的索引设计应该考虑到整个查询。其实mysql可以使用索引来直接获取列的数据。如果索引的叶子节点包含了要查询的数据,那么就不用回表查询了,也就是说这种索引包含(亦称覆盖)所有需要查询的字段的值,我们称这种索引为覆盖索引。注:引入数据表t_user,插入约1千万条记录,用作下文例子使用。1工欲善其事,必先利其器 ...转载 2018-10-06 19:23:38 · 3321 阅读 · 0 评论 -
MySQL存储过程中in、out、inout参数使用实际案例
1.参数in的使用(代表输入,意思说你的参数要传到存过过程的过程里面去)//为了避免存储过程中分号(";")结束语句,我们使用分隔符告诉mysql解释器,该段命令是否已经结束了。/**案例功能:求1-n的和开发者:徐守威时间:2016-08-13*/delimiter $create procedure p1(in n int)begindeclare total int default 0;de...转载 2018-05-25 10:43:40 · 10400 阅读 · 3 评论 -
MySQL定位慢查询步骤
看到问题查询时间是1.36秒,已经很慢.如何把查询时间比较慢的sql语句记录到某个文件中在默认情况下,mysql是不会记录慢查询sql, mysql默认认为10s才是慢查询看看mysql的几个重要的参数.show status //可以列出当前mysql的服务器变量,含义大家查手册.com_xxx 可以查看com_insert com_select com_update com_dele...原创 2018-05-25 10:34:27 · 7354 阅读 · 0 评论 -
搭建lnmp环境,看完傻瓜都会
安装PHP:依赖:libxml2-devel、openssl、openssl-devel、curl-devel、libjpeg-devel、libpng-devel、freetype-devel、1、PHP官网下载PHP: wget 下载链接2、解压压缩包:tar xf mirror3、配置:./configure --prefix=/usr/local/php --enable-fp...原创 2018-11-02 19:14:42 · 671 阅读 · 0 评论 -
比较复杂的sql面试题
一、分组统计每个班的分数前三名(等同于LeetCode:185. Department Top Three Salaries)表结构:create table student(id varchar(20),-- 编号class varchar(20),-- 年级score int-- 分数);insert student values('1','一年级',82);...原创 2018-11-26 17:32:34 · 8346 阅读 · 3 评论 -
MySQL的几个重要的缓冲区配置项
线程栈信息使用内存(thread_stack)主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。排序使用内存(sort_buffer_size)MySQL 用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时...原创 2019-10-31 11:07:08 · 4405 阅读 · 0 评论 -
mac系统mysqld进程无法kill掉的问题
mac安装比linux恶心的太多,权限太受限制kill -9根本无法杀死mysqld进程,查了好久原来是因为LaunchDeamons定时任务守护mysqld进程解决方法:sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist文件名为自己相应目录下的文件名,需要自行查看...原创 2019-07-17 15:49:00 · 3623 阅读 · 8 评论 -
MySql Host is blocked because of many connection errors 解决方法
mysql报错:Host 'XXX.XX.XX.XX'is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts意为:由于许多连接错误,主机“XXX.XX.XX.XX”被阻止;请使用“mysqladmin flush hosts”取消阻止结局方案:1、增加mysql的最大错误连...转载 2019-06-17 10:39:23 · 12377 阅读 · 2 评论 -
经典sql题目,给每个部门中工资最低的员工涨薪1000
具体题目自行查找,千篇一律。第一层select:查找每个部门中比每一个人的工资小的记录的条数,条数<1的员工,则该员工的工资为该部门最低的。select tmp.e_no from ( select e_no from employee e1 where ( select count(*) ...原创 2019-06-16 17:46:05 · 10737 阅读 · 0 评论 -
MySQL使用IN代替OR的原因
对于许多数据库服务器而言,IN()列表不过是多个OR语句的同义词而已,因为IN和OR在逻辑上是等同的。不仅是在MySQL数据库服务器,对于许多其他的数据库服务器使用到IN查询时,都是按照如下方式处理的:[1] 对IN列表中的数值进行排序。[2] 对于查询的匹配,每次使用二分查找去匹配IN列表的数值。所以对于第[2]步,每次比较的算法复杂度大概为O(log n)。相反,对于同样逻辑的OR列表,...转载 2018-12-03 17:17:27 · 8461 阅读 · 0 评论 -
小心MySQL联合索引的效率陷阱
场景:表中有两个索引:索引index_1(create_Time, category_id), index_2(category_id) 查询语句为:select create_time,category_id from table where create_time='15233333333' and category_id='666'; explain结果:使用了index...原创 2018-12-03 17:08:39 · 650 阅读 · 0 评论 -
MyISAM与InnoDB对比(重点索引对比)
一、锁差异myisam支持表级锁,锁定对象的颗粒度大,所以加锁和开锁的速度很快,能够很好地避免死锁innodb支持行级锁,对象的颗粒度小,所以锁定资源争用的概率也小,能够更好地支持并发,容易发生死锁二、事务myisam不支持事务innodb支持事务,具有MVCC和四种隔离级别解决数据一致性问题三、数据文件差异myisam存储在三个文件上,.frm存储表结构,.MYD存放...原创 2018-12-03 16:25:00 · 296 阅读 · 0 评论 -
关于MySQL的权限控制
GRANK赋予username用户使用password在所有主机(%)上对所有数据库(*.)的所有表(.*)的所有权限(all)grant all privileges on *.* to 'username'@'%' identified by 'password';REVOKE回收username用户在所有主机上的所有数据库的所有权限(对应字段参照GRANK)revoke ...原创 2018-11-30 11:40:51 · 237 阅读 · 0 评论