数据结构:
1. THD 线程描述符(sql/sql_class.h)
包含处理用户请求时需要的相关数据,每个连接会有一个线程来处理,在一些高层函数中,此数据结构常被当作第一个参数传递。
THD类中包含线程的许多有用信息。处理客户端的连接不是线程的唯一用途,MySQL还有一些系统线程,如从服务器复制进程和信号处理线程
2. NET 网络连接描述符(sql/mysql_com.h)
网络连接描述符,对内部数据包进行了封装,是client和server之间的通信协议。
3. Item SQL表达式
Item用于实现表达式,如查询条目、函数,where、order、group、on子句等
每个Item类的实例都包含:1、SQL语句中某项的类似物,如where 2、一个值 3、数据类型描述符
只要MySQL与SQL语句打交道,在赋值、比较、聚合和验证一个SQL元素时,你就会发现MySQL在使用Item类与它的子类
4. TABLE 数据库表描述符(sql/table.h)
表类定义了MySQL数据库表在MySQL内存中的形式。表以两种形式存在——打开或者关闭状态。MySQL要想使用表,必须先将其打开。表描述类是在被打开时创建。
表描述类创建后被置于表缓存(table_cache)中,等待下一个查询的重用,以提高访问的效率。
数据库表描述符,分成TABLE和TABLE_SHARE两部分。
5. FIELD 字段描述符(sql/field.h)
域描述符,对列数据类型以及属性的定义,是各种字段的抽象基类。
1. 排序算法:
MySQL排序采用sort_buffer_size设定的线程独占内存进行排序,如果缓存里内放下要排序的数据,那么MySQL会采取载入所有要返回的值进入缓存排序;如果缓存放不下,则把要排序的列放入缓存排序,然后再回表查询返回结果,如果依然放不下,就会采用归并排序,排好序的部分放入磁盘,载入未排好序的部分继续在内存中排序,然后和磁盘上的部分二路归并,直到排序全部完成。
详细参考:《数据库算法与数据结构系列——排序相关》
2. 连接算法:
MySQL关联采用join_buffer_size设定的线程独占内存进行Join操作,Join过程会采用下推算法,如果有WHERE条件,MySQL会先进行过滤,然后才用关联字段去匹配被驱动表,这样可以有效减少参与关联的记录数。
详细参考:《MySQL LEFT/RIGHT JOIN算法效率分析》
3. 缓存算法:
MySQL缓存才用LRU算法,由系统维护一个LRU双向链表。
详细参考:《数据库算法与数据结构——Cache&Buffer&Lock》