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 删除。