do_select()--> sub_select()--> read_record()实际上是join_read_next()或join_read_first()--> ha_index_next--> index_next()实际上是ha_innobase::index_next()-" />
登录
首页 >  数据库 >  MySQL

MySQL内核技术之"查询流程"

来源:SegmentFault

时间:2023-01-21 13:43:41 103浏览 收藏

本篇文章向大家介绍《MySQL内核技术之"查询流程"》,主要包括MySQL,具有一定的参考价值,需要的朋友可以参考一下。

本节讨论MySQL是如何进行数据查询和读取的。首先看一下调用过程:

JOIN::exec()-->
do_select()-->
sub_select()-->
read_record()实际上是join_read_next()或join_read_first()-->
ha_index_next-->
index_next()实际上是ha_innobase::index_next()-->
general_fetch()-->
row_search_mvcc()

ha_innobase是从handler派生出来的,用来做实际查询的。里面的重要结构有:

/** Save CPU time with prebuilt/cached data structures */
row_prebuilt_t*        m_prebuilt;

/** Thread handle of the user currently using the handler;
this is set in external_lock function */
THD*            m_user_thd;

这里面最重要的是m_prebuilt结构,其中比较重要的几项:

btr_pcur_t*    pcur;        /*!

handler是由table调用的,常用的方式是table->file->**,这里的file实际上就是handler。而table在optimizer中被赋值的:

TABLE_LIST *tl= select_lex->leaf_tables;
,因为用了select_lex,就表明一个THD所有的操作都是共享table的。

m_prebuilt->pcur->btr_cur.page_cur.offsets

今天关于《MySQL内核技术之"查询流程"》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql的内容请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>