- 博客(20)
- 收藏
- 关注
原创 MySQL 深潜 - 一文详解 MySQL Data Dictionary Hope Lee
MySQL data dictionary 解决了背景所述旧架构中的诸多问题,使元数据的访问更加安全,存储和管理成本更低。架构实现非常的精巧,通过大量的模版类实现使得代码能够最大程度上被复用。多层缓存的实现也许能显著提升访问效率。通过 client 简洁的接口,让 Server 层和存储层能在任何地方方便的访问元数据。
2024-03-26 20:07:09
444
1
原创 mysql join
这就是我们预测的执行过程。//这个函数在两个地方赋值,一个是在exec中通过make_simple_join赋值为join_init_read_record(没有被优化的join使用这个方法,并且它通过调用init_read_record,初始化该join_table下的read_record方法,如全表扫描为rr_sequential,然后再调用read_record方法读取第一条记录);
2024-03-26 20:06:31
778
原创 MySQL查询优化器源码分析
get_mm_tree()函数用于根据所有查询条件的键,生成一颗查询树。该函数被setup_tables_and_check_access()函数(sql/sql_base.cc:8058)调用,而setup_tables_and_check_access()函数用于准备表以及检查表的是否可以访问,在JOIN::prepare()函数中被调用,而该函数分别调用setup_tables()和check_single_table_access(),其中后者对所有需要的表,循环进行检查是否可以访问。
2024-03-26 20:06:00
1030
原创 mysql中的join算法
BlockNestLoopJoin(BNLJ):MySQL采用了批量技术,即一次利用join_buffer_size缓存足够多的记录,每次遍历内表时,每条内表记录与这一批数据进行条件判断,这样就减少了扫描内表的次数,如果内表比较大,间接就缓解了IO的读压力。如果我们能对内表的join条件建立索引,那么对于外表的每条记录,无需再进行全表扫描内表,只需要一次Btree-Lookup即可,整体时间复杂度降低为N*O(logM)。
2024-03-26 20:05:28
1298
原创 MySQL的join buffer原理及如何提高查询效率
当join buffer满或者是最后一条记录的时候,此时开始启动对于tsecer表的扫描,对于tsecer表中读取的每一个记录,结合前面缓存的每一个记录,看是否满足自己判断条件。在这个使用buffer的例子中,可以看到这个地方只是对于tsecer表进行了一次扫描,而通常来说,数据库的扫描代码是最高的(因为要涉及到磁盘读取),这样使用buffer的方式将tsecer表的扫描降低为1次,所以这个效率提高很多,特别是在涉及到的多个table,并且/或者 每个table中的记录数量都很多的情况下。
2024-03-26 20:04:55
1129
原创 Mysql代码学习
断住之后,分别打印p *qep_tab->read_record.table和p *qep_tab->read_record.table.next会发现,哪个表的数据少,哪个表在table里,而数据多的会在table.next里。不断地变换两个表的数据,总是这样的表现。eliminate_item_equal里用了个add_at_head方法,把后面的表达式加到了前面。实际计算的时候是先算name='a',后算BF='bf'。实际计算的时候是先算BF='bf',后算name='a'。
2024-03-26 20:04:17
217
原创 valgrind调mysql
=3375== by 0x4005BC: main (main.c:14)如上表示,使用malloc申请了4个字节的内存,但在a.c的第8行,对第4(从0开始计数)个字节进行了写操作。重点看HEAP SUMMARY、Invalid free、Invalid read、Invalid write.
2024-03-26 19:56:50
449
原创 JNI内存方面说明以及相关类型手动释放内存
它的生命期是在Native Method的执行期开始创建(从Java代码切换到Native代码环境时,或者在Native Method执行时调用JNI函数时),在Native Method执行完毕切换回Java代码时,所有Local Reference被删除(GC会回收其内存),生命期结束(调用DeleteLocalRef()可以提前回收内存,结束其生命期)。供Java应用程序使用的,所有java对象的内存都是从这里分配的,它不是物理上连续的,但是逻辑上是连续的。
2024-03-26 19:52:22
692
原创 Local Reference的生命周期
不断在各个点打印GetObjectRefType的结果,看看是1还是0。发现DetachCurrentThread后立刻从1变成0了。但是一个奇怪的点是:调用DeleteLocalRef之后居然不会从1变成0,原因暂时未知。简单来说,FindClass、NewObject方法都会返回一个local reference的jobject。DetachCurrentThread的时候local reference失效。这个结论是不是绝对正确的,还不好说。
2024-03-26 19:51:33
266
原创 JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用
https://www.cnblogs.com/fnlingnzb-learner/p/7372189.html
2024-03-26 19:50:32
117
原创 JNI多线程调用ojdbc报错问题排查
从日志里可以看出,8号线程,也就是主线程在isDriverAllowed里传入的classLoader是有效的,而9号线成传入的则是null。各个线程通过FindClass都能够找到DriverManager类,也能够找到getConnection方法,所以不存在多线程找不到类的问题。从这个现象看,跟线程有关。只有主线程,也就是调用JNI_CreateJavaVM的线程能够正常连接,并执行查询返回结果集。看了DriverManager的代码,getConnection的时候报错,有两种可能。
2024-03-26 19:49:47
683
原创 Mysql JDBC调用流程
也没有getConnection的实现(其实有getConnection的实现,但是都不是DriverManager类的,不是上面代码里用到的getConnection)。getConnection会调用具体某个jdbc驱动的connect方法,在这里就是mysql jdbc驱动的connect方法。ServerPreparedStatement.serverPrepare又会调用ServerPreparedQuery.serverPrepare,真正的核心流程在。
2024-03-26 19:43:34
416
原创 调试LIBGCC
Server使用静态链接-static-libgcc的方式使用libgcc,使用的可能不是.dep_create目录下的静态库,而是系统环境的库,所以需要把系统的两个库替换成新编的debug版本的静态库。另外,ARM平台make install之后需要替换的.a文件不再usr/local/下,而是在.dep_create下,可能跟具体的编译环境有关。的错误,解决方法是不要再gcc的源码中直接执行./configure、make、make install等命令。编译7.5的时候遇到。
2023-12-26 16:03:36
516
1
原创 编译debug版本LLVM
export CXX=/usr/local/gcc-5.2.0/bin/g++export CC=/usr/local/gcc-5.2.0/bin/gccexportLD_LIBRARY_PATH=/usr/local/lib/export LD_LIBRARY_PATH=/data/2/ryan.ly/22x/oceanbase/rpm/.dep_create/var/usr/local/gcc-5.2.0/lib64/:$LD_LIBRARY_PATHmkdir llvm_build && cd llv
2023-12-26 15:55:28
456
1
原创 ARM平台偶现4026问题分析
grep __builtin_aarch64_xpaclri,发现7.5的代码中有该定义,进一步发现,uw_init_context_1的实现里增加了MD_POST_EXTRACT_ROOT_ADDR,会在AArch64的情况下对计算出的ra进行进一步修正。从uw_frame_state_for对_Unwind_Find_FDE的调用我们发现,_Unwind_Find_FDE的第一个入参pc是通过context->ra + _Unwind_IsSignalFrame (context) - 1计算出来的。
2023-12-26 15:54:50
1175
1
原创 JNI访问C端struct
这里解决的问题是把C的struct传给Java,并读写其中的内容。仅仅是读写C的struct,不需要把C的数据结构映射到java。定义Java的访问接口JNIDemo.java编译Java生成h文件定义C方法编译so注意需要指定jni.h的目录。执行Java结果...
2022-06-21 16:00:31
205
原创 Mysql修改系统表
以在columns中增加一列xxx_type为例修改系统表定义sql/dd/impl/tables/columns.h里增加enum:FIELD_XXX_TYPE sql/dd/impl/tables/columns.cc里增加:m_target_def.add_field(FIELD_XXX_TYPE, "FIELD_XXX_TYPE", "xxx_type BIGINT UNSIGNED");修
2021-12-23 20:57:23
658
原创 Mysql大对象的存储
建一张表,插入一行大数据。CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 BLOB, f3 TEXT);INSERT INTO t1 VALUES(3, REPEAT( 'a', 20000), REPEAT( 'b', 20000));gdb查看mysql代码堆栈如下。#0 dtuple_convert_big_rec (index=0x7fa8cc3497b8, upd=0x0, entry=0x7fa8cc36f128) at /home/data
2021-12-23 20:49:01
1868
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人