博客首页 » mysql 追踪SQL执行
发布于 20 Feb 2015 04:43
标签 blog
大致执行
http://labs.chinamobile.com/mblog/393521_180022
SQL执行
sql/sql_select.cc handle_select.cc
看mysql是如何实现“select * from table_a”这条SQL语句的。
1. 找到主函数
int mysqld_main(int argc, char **argv)
开始是一大堆初始化,边看边略过。
到达handle_connections_sockets();就是用来处理连接了
2. handle_connections_sockets()建立新的线程来处理连接后的操作。做了一大堆错误处理之后,开始创建响应线程create_new_thread(thd);
3. create_new_thread(thd)里面进行锁的一堆处理,也对线程队列做了一堆处理之后,开始创建了。搞了一个有意思的宏。
MYSQL_CALLBACK(thread_scheduler, add_connection, (thd));
借助eclipse翻译完后就是:
do {
if ((thread_scheduler) && ((thread_scheduler)->add_connection))
(thread_scheduler)->add_connection (thd);
} while (0)
4. 找到scheduler.cc进一步分析。
借助网上的资料和源代码,推断出add_connection是create_thread_to_handle_connection。这部分好难啊,看的头大。这里卡壳了好久。
5. create_thread_to_handle_connection里面看到do_handle_one_connection。很好理解,用来处理一个连接的。应该包括其发过来的SQL语句。话说换到sql_connection了。
6. do_handle_one_connection里面看啊,终于看到了do_command(thd),理解就是开始处理这个线程的sql语句了。继续前进。
7. do_command(thd)进入了sql_parse.cc了,终于要开始解释了。
本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用,仅有一个特殊要求,请用链接方式注明文章引用出处及作者。请协助维护作者合法权益。
系列文章
文章列表
- mysql 追踪SQL执行
这篇文章对你有帮助吗,投个票吧?
留下你的评论