mysql技术
请叫我曾阿牛
宅男,技术控
展开
-
数据库国产化的那些事儿----1
最近在参与数据库国产化的相关工作,热火朝天,忙忙碌碌,也发现数据库国产化的一些怪事儿。很多很多的甲方和应用开发商都要求必须适配某某数据库,或兼容某某特性,否则这个项目就黄了,或换数据库适配。貌似一听也很有道理,毕竟应用开发商是有一些开发的工作量在里面的。不过反过来想想也挺有意思的:1. 到底是数据库是基础软件还是应用软件是基础软件;2、莫非你原来运行在windows上的C程序还让linux改造以支持你的应用程序?3、数据库这个基础软件本来就是百花齐放的,去看看db-eng原创 2022-04-01 20:59:31 · 1150 阅读 · 0 评论 -
InnoDB存储引擎特性之Insert Buffer
InnoDB存储引擎开创性的设计了一个Insert Buffer,对于非聚集索引的插入或更新操作,不是每次直接插入或更新索引页,而是先判断插入的非聚集索引页是否在缓冲池中。如果在,则直接插入;如果不在,则放入一个Insert Buffer中。 这时,数据库的非聚集索引实际上并没有插入或更新相应的叶子节点,而是存放在另外一个位置。然后数据库再以一定的频率和情况进行Insert Buffer和辅助索引叶子节点的merge(合并)操作,这时可以将多个插入合并到一个操作中,大大提高了...原创 2021-10-26 08:33:31 · 122 阅读 · 0 评论 -
MySQL Master Thread的工作方式和相关参数
在InnoDB 1.0.X版本之前,Master Thread线程在IO处理上有很多限制,这些限制是来自硬编码造成的,带来了IO性能上的不足或数据库的性能下降。这些限制包括: 1、刷新100个脏页到磁盘 2、合并20个插入缓冲 所以在InnoDB 1.2.X之后的版本中,对这些做了改进。在这个版本中引入了:参数:innodb_io_capacity,该参数用来表示磁盘IO的吞吐量,默认200; 合并插入缓冲时,合并插入缓...原创 2021-10-24 16:26:13 · 114 阅读 · 0 评论 -
MySQL的checkpoint技术
checkpoint技术的核心就是把缓冲池中的脏页刷新到磁盘,保证交易数据的持久性。当前事务型的数据库都采用了Write Ahead Log策略,也就是WAL,在事务提交时,先写重做日志,再修改页。对于InnoDB存储引擎而言,是通过LSN(Log Sequence Number)来标记版本的。LSN是8字节的数字,单位是字节。每个页有LSN,重做日志也有LSN,checkpoint也有LSN。InnoDB存储引擎的checkpoint有两种:1、Sharp Checkpoingt ..原创 2021-10-24 00:02:10 · 1781 阅读 · 0 评论 -
MySQL的重做日志缓冲
InnoDB存储引擎首先将重做日志信息先放入到重做日志缓冲区,然后按一定的频率将其刷新到重做日志文件。innodb_log_buffer_size参数控制了重做日志缓冲区的大小,默认是8MB。mysql> show variables like 'innodb_%log%buffer_size'\G;重做日志在下列三种情况下会将重做日志缓冲中的内容刷新到外部磁盘的重做日志文件中:1、Master Thread每1秒将重做日志缓冲刷新到重做日志文件2、每个事务提交时会将重做日志缓原创 2021-10-23 22:19:11 · 267 阅读 · 0 评论 -
mysql的LRU队列详解
MySQL的缓冲池(innodb_buffer_pool_instances,innodb_buffer_pool_size)是通过LRU算法来进行管理的。即最频繁使用的页在LRU列表的最前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表尾端的页。 在INNODB引擎中,缓冲池页的大小默认为16KB。 在INNODB引擎中,有一个midpoint位置。新读取到的页,虽然是最新访问的页,但并不直接放到LRU队列的首部,而是放到...原创 2021-10-23 21:28:41 · 1653 阅读 · 0 评论 -
mysql线程相关
查看innodb引擎的版本mysql> show variables like 'innodb_version'\G;查看当前运行的线程mysql> show engine innodb status \G;通过上图可以看到IO Thread 0为insert buffer thread,IO Thread 1为log thread。控制IO线程的参数mysql>show variables like 'innodb_%io_threads'\G;.原创 2021-10-23 19:54:03 · 184 阅读 · 0 评论 -
如果连接到mysql数据库
1. 通过TCP/IP连接 mysql -h192.168.1.10 -u username -p -P $port2. 使用UNIX套接字MySQL> show variables like 'socket'; variable_name:socket value: /tmp/mysql.sock#mysql -u$username -S /tmp/mysql.sockmysql>...原创 2021-10-23 16:06:44 · 69 阅读 · 0 评论 -
mysql 配置文件的读取顺序
mysql数据库启动的时候可以从多个路径下读取配置文件,读取顺序具体如下:$mysql --help |grep my.cn /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf如果数据库配置了多个配置文件,且里面的参数有重复的情况,以最后一个文件中参数的值为准。根据其他数据库的惯例,我是建议在数据库的安装目录下( /usr/local/mysql/...原创 2021-10-23 16:02:38 · 618 阅读 · 0 评论 -
送给国产数据库从业者和使用者几点建议
最近听说了一个国产数据库项目POC的若干故事,深有感触,与大家分享。1、国产数据库作为国产基础软件目前整体趋势是如火如荼,风生水起;2、国产数据库(无论分布式还是集中式)大部分的原型都是PG和mysql两大开源数据库,涉及 mysql分支的(包括mariDB和percana server)恐怕都难逃GPL协议的约束(至于是什么约束,请大家自行百度);从这个角度来说,以PG为原型的貌似风险低一点;3、国产数据库在国产硬件(包含飞腾、ARM、龙芯、兆芯等)上TPCC的值跑的超级高,有的时候甚至跑到了原创 2021-08-31 09:52:14 · 836 阅读 · 2 评论 -
MySQL---如何保证高可用
show slave status 命令,它的返回结果里面会显示 seconds_behind_master,用于表示当前备库延迟了多少秒。seconds_behind_master 的计算方法是这样的: 1、每个事务的 binlog 里面都有一个时间字段,用于记录主库上写入的时间; 2、备库取出当前正在执行的事务的时间字段的值,计算它与当前系统时间的差值,得到 seconds_behind_master。如果主备库机器的系统时间设置不一致,会不会导致主备延迟...原创 2021-01-27 16:08:43 · 109 阅读 · 0 评论 -
MySQL学习---极限性能的相关参数
max_connections:用于设置数据库的最大连接数;当客户端请求过大的时候,可以通过调整这个参数来接纳更多的并发请求进来;wait_timeout :该参数表示一个线程空闲 wait_timeout 这么多秒之后,就会被 MySQL 直接断开连接。可以通过缩短wait_timeout参数来允许接入更多的会话进来。该参数我感觉是有些鸡肋的,如果是空闲的线程,不使用CPU资源才对,另外是否可以直接把max_connections调整到上限?查看事务具体状态,可以查 information_sch原创 2021-01-27 10:07:13 · 341 阅读 · 1 评论 -
MySQL --- 幻读
幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行(在一个事务中,有其他事务向前一个事务的数据范围中插入了数据行)。幻读仅专指“新插入的行”。for update,都是当前读。而当前读的规则,就是要能读到所有已经提交的记录的最新值,类似于committed read。为了解决幻读问题,InnoDB 只好引入新的锁,也就是间隙锁 (Gap Lock)。间隙锁和行锁合称 next-key lock,每个 next-key lock 是前开后闭区间。也就是说.原创 2021-01-08 17:00:50 · 144 阅读 · 0 评论 -
MySQL 查询只返回一行的语句也执行的特别慢
造数:mysql> CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;delimiter ;;create procedure idata()begin declare i int; set i=1; while(i<=100000) do insert into t values(i,i); .原创 2021-01-04 15:25:08 · 411 阅读 · 0 评论 -
MySQL---explain查看执行计划
查看SQL语句的执行计划:explain select .... ;Extra 字段里面多了“Using index”,表示的就是使用了覆盖索引。Extra 这个字段中的“Using filesort”表示的就是需要排序,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。...原创 2020-12-31 13:24:51 · 109 阅读 · 0 评论 -
MySQL---order by如何工作
内存排序sort_buffer_size,就是 MySQL 为排序开辟的内存(sort_buffer)的大小。如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。你可以用下面介绍的方法,来确定一个排序语句是否使用了临时文件。/* 打开optimizer_trace,只对本线程有效 */SET optimizer_trace='enabled=on'; /* @a保存Innodb_rows_rea原创 2020-12-31 09:25:41 · 108 阅读 · 0 评论 -
MySQL---两阶段提交
在MySQL中,所谓的两阶段提交就是redo log和binlog 两个阶段的commit过程。在两阶段提交的不同时刻,MySQL 异常重启会出现什么现象? 1、在时刻 A 发生宕机,也就是写入 redo log 处于 prepare 阶段之后、写 binlog 之前,发生了崩溃(crash),由于此时 binlog 还没写,redo log 也还没提交,所以崩溃恢复的时候,这个事务会回滚。这时候,binlog 还没写,所以也不会传到备库。 2、在时刻 B发生宕机,也...原创 2020-12-23 15:32:12 · 653 阅读 · 1 评论 -
MySQL---count(*) 的实现方式
在不同的 MySQL 引擎中,count(*) 有不同的实现方式。 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;如果加了 where 条件的话,MyISAM 表也是不能返回得这么快的。 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。所以,普通索引树比主键索...原创 2020-12-23 14:55:14 · 172 阅读 · 0 评论 -
MySQL---数据删除之后表文件不变
在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。参数 innodb_file_per_table 参数设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起; 参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中。从 MySQL 5.6.6 版本开始,它的默认值就是 ON 了。建议不论使用 MySQL 的哪个版...原创 2020-12-23 05:39:49 · 598 阅读 · 0 评论 -
MySQL---flush相关
把内存里的数据写入磁盘的过程,术语就是 flush。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。什么情况会引发数据库的 flush 过程呢?第一种场景是,对应的就是 InnoDB 的 redo log 写满了。这时候系统会停止所有更新操作,把 checkpoint 往前推进,redo log 留出空间可以继续写;第二种场景,对应的就是系统内存不足。当需要新的内存页,而内存不够用的时候,就要原创 2020-12-22 12:05:55 · 285 阅读 · 0 评论 -
MySQL学习笔记---伪指令和执行计划
set long_query_time=0;select * from t where a between 10000 and 20000; /*Q1*/select * from t force index(a) where a between 10000 and 20000;/*Q2*/第一句,是将慢查询日志的阈值设置为 0,表示这个线程接下来的语句都会被记录入慢查询日志中;第二句,Q1 是 session B 原来的查询;第三句,Q2 是加了 force index(a) 来和 sess.原创 2020-12-21 15:13:58 · 94 阅读 · 0 评论 -
Mysql存储过程---while 循环示例
delimiter ;;create procedure idata()begin declare i int; set i=1; while(i<=100000)do insert into t values(i, i); set i=i+1; end while;end;;delimiter ;call idata();原创 2020-12-21 14:02:16 · 346 阅读 · 0 评论 -
MySQL学习笔记---普通索引和唯一索引的区别
数据查询过程对于select id from T where k=5这样的等值查询语句,这个查询语句在索引树上查找的过程,先是通过 B+ 树从树根开始,按层搜索到叶子节点,也就是图中右下角的这个数据页,然后可以认为数据页内部通过二分法来定位记。但是普通索引和唯一索引的处理细节上略有差异: 对于普通索引来说,查找到满足条件的第一个记录 (5,500) 后,需要查找下一个记录,直到碰到第一个不满足 k=5 条件的记录。 对于唯一索引来说,由于索引定义了唯一性,查找到第一个...原创 2020-12-21 12:26:24 · 102 阅读 · 0 评论 -
Mysql学习笔记---***事务的隔离***
可重复读隔离级别的理解,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。 这个技术在MVCC中或许可以是这样理解的。但是如果是在通过锁技术实现隔离的场景中,事务T启动的时候就不是创建一个视图了,而且给读取到的某个区域的数据全部加行锁,并在数据行之间加gap锁,以保证其他事务无法修改被锁住数据行之间的全部数据。begin...原创 2020-12-21 10:14:46 · 82 阅读 · 0 评论 -
Mysql学习笔记-行锁
MySQL 的行锁是在存储引擎层由各个引擎实现的。顾名思义,行锁就是针对数据表中行记录的锁。在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。死锁:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁。死锁的处理策略:一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置(默认值是原创 2020-12-21 09:13:10 · 68 阅读 · 0 评论 -
mysql学习笔记---05~~~全局锁和表锁
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是,做全库逻辑备份。不加锁的话,备份系统备份的得到的库不是一个逻原创 2020-12-13 12:34:38 · 82 阅读 · 0 评论 -
mysql学习笔记---04~~~索引的相关技术
常见的索引模型:1、哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。 哈希表这种结构适用于只有等值查询的场景。2、有序数组在等值查询和范围查询场景中的性能就都非常优秀。 如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个...原创 2020-12-10 14:17:49 · 106 阅读 · 0 评论 -
mysql学习笔记---03~~~隔离级的概念和相关技术
当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。SQL 标准的事务隔离级别包括: 读未提交(read uncommitted)、 读提交(read committed)、 可重复读(repeatable read)、 串行化(serializable )。读未提交是指,一个...原创 2020-12-10 08:44:13 · 95 阅读 · 0 评论 -
mysql学习笔记---02~~~redo log and binlog
redo log~~~重做日志binlog~~~归档日志在 MySQL 里,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操原创 2020-12-08 16:46:27 · 131 阅读 · 0 评论 -
mysql学习笔记---01~~~SQL语句的执行步骤
连接器 负责跟客户端建立连接、获取权限、维持和管理连接。 连接命令一般是这么写的:mysql -h$ip -P$port -u$user -p查询缓存 MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户...原创 2020-12-08 12:17:33 · 87 阅读 · 0 评论 -
监控mysql的性能
MySQL 中自带了两个 Schema,分别是information_schema和performance_schema。information_schema保存了数据库中的所有表、列、索引、权限、配置参数、状态参数等信息。像我们常执行的show processlist;就来自于这个 schema 中的 processlist 表。performance_schema提供了数据库运行时的资源消耗情况,它以较低的代价收集信息,可以提供不少性能数据。监控mysql的运行,还有两个命令行工具:..原创 2020-12-07 11:15:09 · 336 阅读 · 0 评论 -
mysql rpm包的安装
查看已经安装的mysql #rpm -qa|grep -i mysql本地程序的卸载 #rpm -e --nodeps mysql-libs-5.1.66-2.el6_3.x86_64mysql的安装依赖包: #yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6 libncurses.s...原创 2019-06-05 21:43:54 · 585 阅读 · 0 评论 -
mysql 二进制安装
二进制mysql的安装过程详解:#groupadd -r -g 306 mysql#useradd -g 306 -r -u 306 mysql#tar -xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local#cd /usr/local#ln -sv mysql-5.5.28-linux2.6-i686 mysql#chown...原创 2019-06-05 21:45:50 · 122 阅读 · 0 评论 -
mysql 源代码编译安装
操作系统补丁:#yum install -y gcc#yum install -y gcc-c++#yum install -y ncurses-devel#yum install -y perl#yum install -y bison #yum install -y autoconf#yum install -y automake#yum install -y libt...原创 2019-06-05 21:50:49 · 212 阅读 · 0 评论 -
mysql存储过程for 循环示例
DELIMITER // 设置//为结束符,否则命令行中的;会与默认的;冲突create procedure pro10()begindeclare i int default 0;while i<100000 do insert into t2 values(i,'aaaaaaaaaaaaaaaaaaaa'); set i = i + 1;end whi...原创 2019-06-26 16:50:07 · 16666 阅读 · 1 评论 -
共享表空间ibdata1的分析
最近在看《mysql技术内幕 innodb存储引擎》一书,当看到书本第95页时,作者介绍了一个强大功能的python脚本,用来查看表空间中各页的类型和信息,py_innodb_page_info.py。下载地址:http://david-mysql-tools.googlecode.com/svn-history/r15/trunk/py_innodb_page_type/,下载内容:#...转载 2019-07-02 09:59:45 · 408 阅读 · 0 评论 -
开启mysql的二进制日志
开启方法:1、编辑/etc/my.cnf2、增加如下三行:server_id=1log_bin=binloglog_bin_index=binlog.index3、重启mysql4、验证方法:mysql> show variables like '%log%bin';+---------------+-------+| Variable_name | Valu...原创 2019-06-26 22:49:09 · 324 阅读 · 0 评论 -
MySQL range 分区表
create table t2( id int null )engine=innodb partition by range(id) ( partition p0 values less than (10), partition p1 values less than (20)); 查看分区表的信息: mysql> select ...原创 2019-07-10 09:17:03 · 344 阅读 · 0 评论 -
MySQL list 分区
list分区和range分区是类似的,不过分区列的值是离散的,而非连续的。 create table t4( a int null, b int )engine=innodb partition by list(b) ( partition p0 values in (1,3,5,7,9), partition p1 values in (2,4,...原创 2019-07-10 21:04:08 · 516 阅读 · 0 评论 -
MySQL hash分区
hash分区的目的是将数据均匀的分布到预先定义的各个分区中,保证各个分区的数据量大致都是一样的。使用partition by hash(expr)子句,其中expr是一个返回一个整数的表达式。 create table t5( a int null, b datetime )engine=innodb partition by hash(year(b)) ...原创 2019-07-10 21:04:46 · 1098 阅读 · 0 评论