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;        /*!< persistent cursor used in selects
                and updates */
innodb_session_t*
        session;    /*!< InnoDB session handler. */
/** The MySQL table object */
TABLE*        m_mysql_table;

/** The MySQL handler object. */
ha_innobase*    m_mysql_handler;

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

    原文作者:Michael
    原文地址: https://segmentfault.com/a/1190000011572381
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞