前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3.Mysql 主要数据结构

3.Mysql 主要数据结构

原创
作者头像
马说
修改2020-10-29 17:49:42
6920
修改2020-10-29 17:49:42
举报
文章被收录于专栏:Java 汇总Java 汇总

Bulk Insert 在批量插入数据时,并非直接将key写入 B-tree,而是写入红黑树,当红黑树达到上限时,将所有的key写入磁盘。写入的key 流 是已经排序好的,所以写入非常快

缓存 1.Key cache 所有B-Tree索引的共享缓存,使用hash 和 反转链表来快速定位最近使用的blocks,并快速特定表的更新项。位于 mysys/mf_keycash.c 2.Record cache 这用于快速扫描表中的所有记录。位于 mysys/mf_iocash.c and isam/_cash.c 3.Table Cache 它保存最近使用的表 位于 sql/sql_base.cc 4.Privilege Cache 为了允许在数据库之间进行快速更改,将为每个用户/数据库组合缓存上次使用的权限。 位于sql/sql_acl.cc 5.Heap Table Cache group by或distinct 缓存找到的行,放入到 heap table中, 6.Join Buffer Cache 连接缓存,由 join_buffer_size 变量定义大小,该缓存仅用于 join type 是 ALL 或 INDEX,不会为第一个非 常量表 分配 Join buffer,当需要在两个表之间进行完全联接时,缓冲区就会被分配,并在查询完成后释放。只缓存使用到的列,而不是所有列。 例如:    Table name     Type     t1                    range     t2                    ref     t3                    ALL  执行如下join: - While rows in t1 matching range     - Read through all rows in t2 according to reference key  根据 reference key 读取 t2          - Store used fields from t1, t2 in cache          - If cache is full               - Read through all rows in t3                    - Compare t3 row against all t1, t2 combinations in cache                          - If row satisfies join condition, send it to client               - Empty cache  table3 被扫描的次数计算如下: S = size-of-stored-row(t1,t2) C = accepted-row-combinations(t1,t2) scans = (S * C)/join_buffer_size + 1 由此可知:join_buffer_size的值越大,t3的扫描越少。如果join_buffer_size已经足够大,足以容纳所有以前的行组合,那么将其变大将无法获得更快速度。如果有多个连接类型为ALL或index的表,那么我们为每个表分配一个join_buffer_size大小的缓冲区,并使用上面描述的相同算法来处理它。(换句话说,我们将同一行组合多次存储到不同的缓冲区中。)

刷新table 1.刷新TABLES 的逻辑在 sql/sql_base.cc::close_cached_tables() 方法中 2.刷新表的思想是强制关闭所有表。这主要是为了确保如果有人在MySQL之外添加了一个新表(例如,通过cp将文件复制到数据库目录中),所有线程都将开始使用新表。这还将确保所有表更改都刷新到磁盘。 3.执行刷新表时,变量refresh_version将递增。每次线程释放表时,它都会检查表的刷新版本是否与当前的刷新版本相同。否则,它将关闭它,并发送COND_refresh信号量 4.在线程获得表锁之后,还将当前的refresh_version 与open refresh_version 进行比较。如果刷新版本不同,线程将释放所有锁,重新打开表并再次尝试获取锁。这只是为了快速让所有表使用最新版本。 5.如果执行刷新表的线程在某些表上有锁,它将首先关闭锁定的表,然后等待所有其他线程也关闭了它们,然后重新打开它们并获取锁。在此之后,它将给其他线程一个打开相同表的机会。

线程 线程在MySQL中有几个级别:在 mysql_priv.h中定义     #define  INTERRUPT_PRIOR     10     #define  CONNECT_PRIOR         9     #define  WAIT_PRIOR                  8     #define  QUERY_PRIOR              6 1.main thread:以CONNECT_PRIOR级别运行。 2."bootstrap" thread:在sql_parse.cc::handle_bootstrap() , mysql_install_db脚本启动一个服务器,其中有一个选项告诉它启动这个线程并从文件中读取命令。用于初始化授权表。运行一次然后退出。 3."maintenance" thread: sql_manager_cc,与unix中旧的“sync”守护进程一样,此线程偶尔会将MyISAM表刷新到磁盘。InnoDB有一个单独的维护线程,但是BDB也使用这个线程偶尔调用berkeley_cleanup_log_files()。从启动时开始,一直持续到关闭。 4."handle TCP/IP sockets" thread:mysqld.cc::handle_connections_sockets(),使用select()函数调用循环,以处理传入的连接。 5.Signal handler ("interrupt") thread:INTERRUPT_PRIOR 级别,mysqld.cc::signal_hand() 设置接收信号,然后在信号传入时进行处理。从服务器启动时开始,一直持续到关闭。 6."shutdown" thread:mysqld.cc::kill_server() ,由信号处理线程创建。使用close_connections()关闭所有连接,结束。 7. per-connection threads : QUERY_PRIOR 或 WAIT_PRIOR 级别。 8.two slave thread:一个线程连接到主机并处理网络IO。另一个从中继日志读取查询并执行它们。 在InnoDB中,所有的线程管理都是通过os/os0thread.c来处理的

BitMap mysys目录中有一个名为my_bitmap.c的文件,它包含操作bitmap的函数。 具体来说,有设置或释放(bitmap_init,bitmap_free), 设置和清除位图的单个位或整个部分(bitmap_set_bit,bitmap_fast_test_and_set,bitmap_clear_all,bitmap_set_all,bitmap_set_prefix,bitmap_set_) 在两个位图上执行比较和设置操作(bitmap_cmp,bitmap_intersect,bitmap_subtract,bitmap_union)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档