12 mysql
文章平均质量分 82
mysql 的相关问题
教练、我想打篮球
这个作者很懒,什么都没留下…
展开
-
16 “count(*)“ 和 “count(1)“ 和 “count(field1)“ 的差异
假设是全表扫描, 主要的影响就是 “ select count(field1) ” 是走聚簇索引, 还是非聚簇索引了, 然后 “其他select count” 会优先选择较小的非聚簇索引, 造成的影响主要是 io 的开销, 走非聚簇索引所需要的 io 较小。解析出来的 对象有所调整, 但是结果不变, PTI_text_literal_text_string 这边判断为不为空的方式也是基于 Item::is_null, 也是恒不为空。原创 2023-09-09 07:40:55 · 748 阅读 · 1 评论 -
58 mysql 存储引擎之 MEMORY
加上 一部分 mysql 的隐藏字段, 比如 hash_field, group_null_fields, null_pack_fields 等等, 这里只有 null_pack 占用的空间, 三字节, 最终 reclength 为 9441。对于 varchar 部分字段, 预留了足够的空间, 长度 + 存储的空间, 这里是基于 utf8 编码, 因此存储长度 “1538 = 2 + (512 * 3)”, “193 = 1 + (3 * 64)”从这里可以看出 实际上这个逻辑过滤的条件还是在过滤。原创 2024-08-09 12:54:41 · 570 阅读 · 0 评论 -
56 mysql 用户权限相关的实现
这里讨论 mysql 的权限相关处理使用如下语句创建 tz_test 用户, 并赋予他 test_02 数据库的查询权限查询目标数据表, 数据如下, tz_test_02执行 update 之后, 客户端这边 得到的信息如下。原创 2024-09-23 18:51:57 · 991 阅读 · 0 评论 -
55 mysql 的登录认证流程
这里我们来看一下 mysql 的认证的流程我们这里仅仅看 我们最常见的一个 认证的处理流程我们经常会登录的时候 碰到各种异常信息大概的流程是这样客户端和服务器建立连接之后, 服务器向客户端发送 salt然后 客户端根据 salt 将客户端传入的密码加密之后, 以及相关登录信息传递给服务器然后 服务器进行验证, 验证失败, 响应对应的错误信息给客户端服务器发送 salt 的信息如下客户端发送的认证请求如下服务器响应的认证失败信息如下。原创 2024-09-15 08:03:51 · 980 阅读 · 0 评论 -
54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout
在 mysql 的服务器配置中, 我们经常会使用到几个 timeout诸如 connect_timeout, wait_timeout, interactive_timeout, read_timeout, write_timeout 等等我们 这里来看一下 他们的具体的使用场景, 以及具体控制的相关信息 是什么这个是 客户端 和 服务器建立连接之后, 客户端需要向服务器发起认证请求如果在 connect_timeout 期限内, 客户端未发送认证请求, 服务器会断开 和 客户端的连接。原创 2024-09-09 12:48:33 · 726 阅读 · 0 评论 -
53 mysql pid 文件的创建
在 mysql 中文我们在 “service mysql start”, “service mysql stop” 经常会碰到 mysql.pid 相关的错误信息。通常来说, 我们使用 “service mysql stop” 或者 “kill $pid” 会执行该清理。删除了 pid 文件之后的日志信息如下, 基本上是在 mysql 生命周期的最后面了。我们这里来看一下 mysql 中 mysql.pid 文件的创建 和 清理的时机。删除 pid 文件的时候, 日志上下文如下。原创 2024-09-02 18:00:26 · 486 阅读 · 0 评论 -
52 mysql 启动过程中常见的相关报错信息
我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题但是 从来未曾思考过 这个问题到底是 怎么造成的这个在启动的时候, 主要造成的情况一般是。原创 2024-08-26 20:28:00 · 989 阅读 · 0 评论 -
51 无显式主键时 mysql 增加的 DB_ROW_ID
假设有 implicit_id_table_02, 然后增加了 两条记录, 之后再向 implicit_id_table 中增加记录, 得到的 DB_ROW_ID 为 558。创建表的时候, 创建了该 三个系统字段, DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR。row_id 的处理是通过 dict_sys_get_new_row_id 函数来获取的。为 DB_ROW_ID, DB_TRX_ID, DB_POLL_PTR 分配存储空间的地方。原创 2024-08-19 12:50:07 · 573 阅读 · 0 评论 -
50 mysql 的 “where 1 = 1“ 的优化处理
问题是来自于 chinaunix 问题 ”mysql 中在 java 代码中我们经常会使用到 ”where 1 = 1 and username = ‘jerry’ ” 之类的条件然后 我们这里 来看一下 “where 1 = 1” 的相关处理执行 sql 如下 “select *, 2, 2, 2 from tz_test where id = 1;sql_lex 中存储的原始查询语句中的查询条件因为这里是基于索引的查询, 查询条件放到了 qep_tab->m_qs->m_ref 中。原创 2024-08-09 12:55:03 · 1208 阅读 · 0 评论 -
49 mysql 子查询 加 group by 产生的奇怪现象
这里要提到的是一个 之前碰到的一个 很令人诧异的查询, 主要是 和 group 查询有关系查询如下, 按照常规理解, “select id from t_user_02 where name = 'jerry' group by age” 会返回 两条数据, 然后 整个查询 会查询出两条数据但是 结果很令人差异, 查询出了 四条数据测试数据表如下, t_user 和 t_user_02 完全一样, t_user_02 是由 t_user 复制而来测试数据如下查询结果如下。原创 2024-08-05 10:42:48 · 443 阅读 · 0 评论 -
48 mysql 全局变量修改了时区, 客户端拿到的依然是旧时区
这是一个 我们最近碰到的问题在我们的一个 服务平台 查询到的时间字段 比 当前时区的当前时间多 8 小时然后 这个问题 也是挺神奇的, navicate 上面查询到的 时间是在正常的时间然后 查询环境变量 tz_zone 是 “+08:00”, 也没有问题, 但是 客户端这边 拿到的是 当前时间 + 8小时时间相关数据传输以及转换 请参见 mysql date/time/datetime/year 的数据存储从结果上来看 可以大致的推断是。原创 2024-07-26 13:51:23 · 469 阅读 · 0 评论 -
47 ‘./test_02/tz_test_tmp‘ (errno: 184 - Tablespace already exists)
当我 看到这个的时候, 去查询了一下 information_schema 中的 INNODB_SYS_TABLES 和 INNODB_SYS_TABLESPACES 的信息, 可以看到 找不到对应的 tz_test_tmp。然后 拷贝 tz_test.idb 为 tz_test_tmp.idb 文件, 然后 将另外一张表 更新为 tz_test_tmp, 然后 就复现了问题。执行 sql 如下 “alter table tz_test_updated rename to tz_test_tmp;原创 2024-07-19 12:53:41 · 339 阅读 · 0 评论 -
46 mysql 客户端拿不到具体的错误信息
这是最近碰到的一个问题同样的一个 环境的问题, 在正常的 mysql 环境会返回 具体的错误信息, 然后 在我的另外一个环境里面 只能返回一些 unknown error 之类的 十分抽象的环境然后 我们这里 来看一下 具体的情况 我们这里从 错误的环境 往前推导来查看 并解决这个问题这里构造的问题是一个 Table space already exists 的问题, 在重命名表名的时候, 将表名更新为 另外一个存在 ibd 的表名, 这时候 就会抛出如下异常。原创 2024-07-13 09:09:50 · 292 阅读 · 0 评论 -
45 mysql truncate 的实现
这里的主要的流程是 一系列的校验, 生成新的newTableId, 删除索引, 重新创建索引, 关联 newTableId 和已有的元数据信息, truncate idb 文件 等等。truncate 数据表 tz_test_big_table_copy 的 idb 文件, 仅仅保留 114688 字节。执行 sql 如下 “truncate table tz_test_big_table_copy;information_schema 中相关元数据信息如下。重新创建 tz_test_02 的相关索引。原创 2024-07-06 07:46:22 · 385 阅读 · 0 评论 -
44 mysql batch insert 的实现
执行 sql 如下 “insert into tz_test_02 (`field1`, `field2`) values ("你好0", "没意思0"), ("你好1", "没意思1"), ("你好2", "没意思2"), ("你好3", "没意思3"), ("你好4", "没意思4"), ("你好5", "没意思5"), ("你好6", "没意思6"), ("你好7", "没意思7"), ("你好8", "没意思8"), ("你好9", "没意思9");tz_test_02 的数据列表拷贝如下。原创 2024-06-28 17:15:15 · 415 阅读 · 0 评论 -
43 mysql insert select 的实现
我们这里 来探讨一下 insert into $fields select $fields from $table;的相关实现, 然后 大致来看一下 为什么 他能这么快按照 我的思考, 应该里里面有 批量插入才对, 但是 调试结果 发现令我有一些意外呵呵 果然 只有调试才是唯一的真理测试数据表如下tz_test 的数据如下执行 sql 如下 “insert into tz_test_02 select * from tz_test;原创 2024-06-23 21:45:28 · 450 阅读 · 0 评论 -
42 mysql “+“ 操作符的实现
问题来自于 chinaunix,mysql 的一些基础的 算术运算符 的计算的实现这里 整理如下 case, 执行之前 设置如下变量解析 sql 的时候, 会将 表达式 解析为一个 Item_func_plus, 左右操作数为 Item_func_get_user_var 变量名分别为 a, b查询的时候 选择列即为 上面解析表达式的时候 resolve 的 Item_func_plus然后由 Item_func_plus 来计算结果, 以及响应数据。原创 2024-06-16 21:14:32 · 542 阅读 · 0 评论 -
41 mysql subquery 的实现
sub query 是一个我们经常会使用到的一个 用法我们这里 看一看各个场景下面的 sub query 的相关处理查看 本文, 需要 先看一下 join 的相关处理测试数据表如下, 两张测试表, tz_test, tz_test03, 表结构 一致tz_test 数据如下tz_test_03 数据如下。原创 2024-06-10 17:25:38 · 796 阅读 · 0 评论 -
40 mysql join 的实现
join 是一个我们经常会使用到的一个 用法我们这里 看一看各个场景下面的 join 的相关处理测试数据表如下, 两张测试表, tz_test, tz_test03, 表结构 一致tz_test 数据如下tz_test_03 数据如下执行 sql 如下 ”select * from tz_test as t1 inner join tz_test_03 as t2 on t1.id = t2.id where 1 = 1”原创 2023-12-03 23:40:06 · 1045 阅读 · 0 评论 -
39 关于 binlog 日志
bin log 相关呵呵 记得之前是做过基于 binlog 的数据同步到的, 这里 可以来了解一下 binlog 的产生, 以及 相关更加详细的信息说不定 之后也可以 做一个 binlog 的解析工具这里 来看一下 各个常见的 binlog event 的相关格式测试数据表如下测试数据如下配置信息如下, 这里 binlog 格式使用的是 ROW。原创 2023-11-24 17:26:06 · 1032 阅读 · 0 评论 -
38 关于 redo 日志
undo 和 redo 是在 mysql 中 事务, 或者 异常恢复 的场景下面 经常会看到的两个概念这里 来看一下 redo, redo 主要是用于 异常恢复 的场景下面测试表结构如下测试数据如下执行 sql 如下“begin;rollback;在 mtr 中分配 buff 来存放 redo log存放 type, space_id, page_no, 字段数量, 唯一确定记录的字段索引, 各个字段的长度列表存放 flags, trxId, pollPtr, 记录偏移。原创 2023-11-24 17:25:54 · 420 阅读 · 0 评论 -
37 关于 undo 日志
undo 和 redo 是在 mysql 中 事务, 或者 异常恢复 的场景下面 经常会看到的两个概念这里 来看一下 undo, undo 主要是用于 事务回滚 的场景下面测试表结构如下测试数据如下执行 sql 如下 “update tz_test set field1 = 'field13' where id = '2';首先是获取 undo 页的 free 记录的偏移, 然后 开始记录数据记录操作类型, undo_no, table_id 等等 相关上下文信息。原创 2023-11-17 17:17:30 · 126 阅读 · 0 评论 -
36 mysql 主键冲突 和 唯一索引冲突
我们这里 来看一下 我们经常碰到的 "duplicate key xxx"测试表结构如下放入测试数据如下检查 tz_test 中主键索引 约束的地方已经存在的记录 和待插入的记录 在目标 索引字段列表 一致, 然后 响应 true 表示存在重复的 id然后 外层更新错误信息为 DUPLICATE_KEY然后 外层 write_record 来校验错误信息, 如果是 DUPLICATE_KEY然后输出 错误编码 以及 错误相关信息。原创 2023-11-17 17:17:04 · 316 阅读 · 0 评论 -
35 字段类型不匹配 影响 使用索引?
这是一个经常能够看到的问题, 又或者 经常在面试中碰到如果 索引字段类型 不匹配, 然后 不会使用索引这里 我们来看一下 具体的情况测试表结构如下数据信息如下, 接近 1000_0000 条数据。原创 2023-11-10 16:19:35 · 111 阅读 · 0 评论 -
34 mysql limit 的实现
这里来看一下 我们常见的 mysql 分页的 limit 的相的处理这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理但是由于 数据表的数据量较大, 越到后面的分页, 该页的查询 耗时越大。原创 2023-11-10 16:19:28 · 311 阅读 · 0 评论 -
33 mysql find_in_set 的实现
sub_select 中全表遍历所有的记录, 然后这里 Item_func_find_in_set 中来进行过滤, 这里的处理类似于 in 的处理, 如果这里校验没有通过, 不响应数据给客户端。find_in_set 的具体实现如下, 就是基础的字符串处理的方式, 来判断 buffer 根据 “,”号 分割之后的字符串列表 是否包含 find。这里我们主要是来探讨一下 mysql 中 in 的使用, find_in_set 的使用。然后我们来看下一篇 find_in_set 的是实现。原创 2023-11-03 13:54:19 · 209 阅读 · 0 评论 -
32 mysql in 的实现
这里我们主要是来探讨一下 mysql 中 in 的使用, find_in_set 的使用这两者 在我们实际应用中应该也是 非常常用的了测试数据表如下然后测试数据如下执行 sql 如下 “select * from tz_test where field1 in ("field1", "field5");explain 如下, 然后 这个查询会将 sql 拆分为 类似于如下效果然后我们来看一下 迭代这多个 range 查询的地方。原创 2023-11-03 13:54:06 · 232 阅读 · 0 评论 -
31 select max/min/avg/sum/count/group_concat 的实现
avg, sum, max, min, count 的相关使用这里来调试一下 具体的情况, 以及看一下 索引对于相关操作的影响测试数据表如下测试数据如下这两者 差不多, 因此 我们这里 仅仅看一下 select max执行 “select max(id) from tz_test;” 如下根据索引查询获取最大的值, 这里获取到的是 10 对应的记录然后 因为有索引, 仅仅会查询 最大 的那条记录然后 merge 的时候, 只会处理 最大 的这条记录, 更新为 结果。原创 2023-10-27 10:46:21 · 191 阅读 · 1 评论 -
30 “select distinct(field1)“ 的实现
在日常工作生活中, 我们应该经常会使用到 select distinct(field) from table;等功能来实现 获取符合条件的 field 的去重之后的记录信息然后 我们这里来看一下 具体的实现测试数据表如下测试数据列表如下这里来看一下 “select distinct(field1) from tz_test;查询主键索引, 然后迭代数据返回 比如这里是 id 为 1 的记录如下为 id 为10 的记录执行 explain 情况如下。原创 2023-10-27 10:46:13 · 120 阅读 · 0 评论 -
29 “select *“ 或者 “select field1, field2“ 的实现
这里我们来探究一下 “select *” 或者 “select 字段列表“ 的相关实现当然 这一部分在 “” 里面有具体的体现, 只是 可能没有那么细致这里 来概览一下 这里的整个流程setup_wild 的地方是处理 “select *” 的地方外层迭代的是 table 的所有的字段, 这里迭代的是 “id”, “field1”, “field2”然后这里 evalutate 的貌似有点问题, 但是 实际是迭代了 这三个字段。原创 2023-10-20 16:44:24 · 126 阅读 · 0 评论 -
28 mysql 数据记录的 存储更新删除
前面 我们探讨了 索引记录的 新增, 更新, 删除这里 我们来看一下 mysql 的核心数据记录的 新增更新删除这里 来看一下 增删改 的相关实现数据记录 和 索引记录 的处理方式是一致的。原创 2023-10-20 16:44:13 · 316 阅读 · 0 评论 -
27 mysql 组合索引 的存储以及使用
将 tz_test 的数据 抽取到 tz_test_02, 然后执行 sql, “update tz_test_02 set field3 = field1;“field33” 表示的是 field1, “33” 表示的是 field2, 再之后为索引记录映射的主键记录信息。因此, 查询 field1 的记录可以走索引, 查询 field1 + field2 的记录可以走索引。索引记录 和 数据记录 的处理方式是一致的。扫描的记录如下, 可以看到是 走的所有的记录。扫描的记录如下, 可以看到是 走的索引。原创 2023-10-14 09:23:19 · 186 阅读 · 0 评论 -
26 mysql 索引的存储更新删除
这里来看一下 mysql 中索引的 增删改查查询在前面的系列文章中都有使用到这里 来看一下 增删改 的相关实现索引记录 和 数据记录 的处理方式是一致的创建数据表如下, 除了主键之外, 创建了一个 field1, field2 的一个联合索引将 tz_test 的数据 抽取到 tz_test_02, 然后执行 sql, “update tz_test_02 set field3 = field1;我们这里为了测试新增索引记录, 新增一条记录信息如下。原创 2023-10-14 09:22:31 · 237 阅读 · 0 评论 -
25 mysql like 是否使用索引
这里主要是 探究一下 explain $sql 中各个 type诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录以及 相关的差异此系列文章建议从开始看测试表结构信息如下测试数据为序列 1 – 99。原创 2023-10-06 11:40:38 · 186 阅读 · 0 评论 -
24 mysql all 查询
在 row_search_mvcc 中增加输出, “printf(”%s”, ((char*)rec+0x11))”诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断。然后 “field99” 表示的是 field1 字段, 再之后的 “99” 是 field2 字段。第一条记录如下, 这是第一条记录, 然后 会依次遍历整张表的所有的记录。输出情况如下, 可以看到的是 遍历了所有的记录。测试数据为序列 1 – 99。随便查询一个 非索引字段。原创 2023-10-06 11:40:20 · 199 阅读 · 0 评论 -
23 mysql index 查询
遍历了 field1 的所有的索引记录, 99条记录 + infimum + supremum + supremum。遍历了 field1 的所有的索引记录, 99条记录 + infimum + supremum + supremum。诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断。这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录。row_search_mvcc 如下, 遍历的是索引记录。我们来看一下 整理流程遍历的索引列表。原创 2023-09-28 18:10:59 · 294 阅读 · 0 评论 -
22 mysql range 查询
前言这里主要是 探究一下 explain $sql 中各个 type诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录以及 相关的差异此系列文章建议从开始看测试表结构信息如下测试数据为序列 1 – 99执行查询如下 “select * from tz_test where field1 > 'field33' and field1 < 'field37';原创 2023-09-28 18:10:48 · 301 阅读 · 0 评论 -
21 mysql ref 查询
btr_pcur_open_with_no_init 根据这个主键查询条件去定位目标记录, 将记录信息更新到 prebuilt->cluster_pcur 中相关。查询索引, 定位到的最近的一条记录是索引记录 ‘field14 -> 14’, 然后是根据是根据条件进行匹配, 结果匹配不上退出 row_search_mvcc。row_sel_get_clust_rec_for_mysql 中是根据索引记录获取真实的记录。prebuilt->clust_ref 为根据索引记录构造出的 主键查询条件。原创 2023-09-22 21:02:10 · 574 阅读 · 0 评论 -
20 mysql const 查询
然后再根据用户记录 线性查找, 找到目标记录, 将 cursor 存储与 prebuilt->pcur->btr_cur->page_cur->rec。最终 const_table_map 和 found_const_table_map 匹配不上, 进而标记了 zero_result_cause。诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断。然后下一次迭代, 继续进入这里的比较, 两者不相等, row_search_mvcc 执行结束。原创 2023-09-22 21:02:03 · 371 阅读 · 0 评论 -
17 mysql global_variables & session_variables
这是一个关于 mysql 中的一些配置的探索起因是需要 看一下 mysql 自增长的实现, 这里面涉及到两个变量auto_increment_increment, auto_increment_offset, 然后 需要探索一下 这两个变量的来历然后 就有了这里的相关介绍global_variables 来自于外部可以看到 在 main 入口的地方, 已经被初始化一次了init_common_variables 中有对 global_system_variables 做一定的初始化。原创 2023-09-08 18:51:53 · 541 阅读 · 0 评论