当前位置: 首页 > news >正文

兰州市网站建设_网站建设公司_无障碍设计_seo优化

沐雪专业网站建设,昆明抖音推广,《设计》完整版,东莞网站建设少儿托管一#xff1a;背景1. 讲故事最近看各大技术社区#xff0c;不管是知乎#xff0c;掘金#xff0c;博客园#xff0c;csdn基本上看不到有小伙伴分享sqlserver类的文章#xff0c;看样子这些年sqlserver没落了#xff0c;已经后继无人了#xff0c;再写sqlserver是不可能… 一背景1. 讲故事最近看各大技术社区不管是知乎掘金博客园csdn基本上看不到有小伙伴分享sqlserver类的文章看样子这些年sqlserver没落了已经后继无人了再写sqlserver是不可能再写了这辈子都不会写了只能靠技术输出mysql维持生活这样子。二了解架构图mysql最大的好处就是开源 手握百万源码有什么问题搞不定呢这一点要比sqlserver爽多了不用再dbcc捣来捣去。1. 从架构图入手大家都知道做/装修房子都要有一张图纸其实软件也是一样只要有了这么一张图纸大方向就定下来了再深入到细节也不会乱了方向然后给大家看一下我自己画的架构图画的不对请轻拍。其实SqlServerOracleMySql架构都大同小异MySql的鲜明特点就是存储引擎做成了插拔式这就牛逼了现行最常用的是InnoDB这就让我有了一个想法有一套业务准备用 InMemory 模式跑一下厉害了~~~2. 功能点介绍MySql其实就两大块一块是MySql Server层一块就是Storage Engines层。1 Client不同语言的sdk遵守mysql协议就可以与mysqld进行互通。2 Connection/Thread PoolMySql使用C编写Connection是非常宝贵的在初始化的时候维护一个池。3 SqlInterface,Parse,Optimizer,Cache对sql处理解析优化缓存等处理和过滤模块了解了解即可。4 Storage Engines负责存储的模块官方第三方甚至是你自己都可以自定义实现这个数据存储这就把生态做起来了????????。三源码分析关于怎么去下载mysql源码这里就不说了大家自己去官网捣鼓捣鼓哈本系列使用经典的 mysql 5.7.14版本。1. 了解mysql是如何启动监听的手握百万行源码怎么找入口函数呢????????????其实很简单在mysqld进程上生成一个dump文件然后看它的托管堆不就好啦。。。从图中可以看到入口函数就是 mysqld!mysqld_main0x227 中的 mysqld_main, 接下来就可以在源码中全文检索下。1 mysqld_main 入口函数 sql/main.cc extern int mysqld_main(int argc, char **argv);int main(int argc, char **argv){return mysqld_main(argc, argv); } 这里大家可以用visualstudio打开C源码使用查看定义功能非常好用。2 创建监听 int mysqld_main(int argc, char **argv){//创建服务监听线程handle_connections_sockets(); }void handle_connections_sockets(){//监听连接new_sock mysql_socket_accept(key_socket_client_connection, sock,(struct sockaddr *)(cAddr), length);if (mysql_socket_getfd(sock) mysql_socket_getfd(unix_sock))thd-security_ctx-set_host((char*) my_localhost);//创建连接create_new_thread(thd); }//创建新线程处理处理用户连接 static void create_new_thread(THD *thd){thd-thread_id thd-variables.pseudo_thread_id thread_id;//线程进了线程调度器MYSQL_CALLBACK(thread_scheduler, add_connection, (thd)); } 至此mysql就开启了一个线程对 3306 端口进行监控等待客户端请求触发 add_connection 回调。2. 理解mysql是如何处理sql请求这里我以Insert操作为例稍微解剖下处理流程当用户有请求sql过来之后就会触发 thread_scheduler的回调函数add_connection。 static scheduler_functions one_thread_per_connection_scheduler_functions {0, // max_threadsNULL, // initinit_new_connection_handler_thread, // init_new_connection_threadcreate_thread_to_handle_connection, // add_connectionNULL, // thd_wait_beginNULL, // thd_wait_endNULL, // post_kill_notificationone_thread_per_connection_end, // end_threadNULL, // end }; 从 scheduler_functions 中可以看到add_connection 对应了 create_thread_to_handle_connection也就是请求来了会触发这个函数从名字也可以看出用一个线程处理一个用户连接。1 客户端请求被 create_thread_to_handle_connection 接管及调用栈追踪 void create_thread_to_handle_connection(THD *thd){if ((error mysql_thread_create(key_thread_one_connection, thd-real_id, connection_attrib,handle_one_connection,(void*) thd))){} } //触发回调函数 handle_one_connection pthread_handler_t handle_one_connection(void *arg) {do_handle_one_connection(thd); } //继续处理 void do_handle_one_connection(THD *thd_arg){while (thd_is_connection_alive(thd)){mysql_audit_release(thd);if (do_command(thd)) break; //这里的 do_command 继续处理} } //继续分发 bool do_command(THD *thd){return_value dispatch_command(command, thd, packet1, (uint) (packet_length-1)); } bool dispatch_command(enum enum_server_command command, THD *thd, char* packet, uint packet_length){switch (command) {case COM_INIT_DB: .... break;...case COM_QUERY: //查询语句insert xxxxmysql_parse(thd, thd-query(), thd-query_length(), parser_state); //sql解析break;} } //sql解析模块 void mysql_parse(THD *thd, char *rawbuf, uint length, Parser_state *parser_state){error mysql_execute_command(thd); } 2 到这里它的ParseOptimizerCache都追完了接下来看sql的CURD类型继续追。。。 //继续执行 int mysql_execute_command(THD *thd) {switch (lex-sql_command){case SQLCOM_SELECT: res execute_sqlcom_select(thd, all_tables); break;//这个 insert 就是我要追的case SQLCOM_INSERT: res mysql_insert(thd, all_tables, lex-field_list, lex-many_values,lex-update_list, lex-value_list,lex-duplicates, lex-ignore);} } //insert插入操作处理 bool mysql_insert(THD *thd,TABLE_LIST *table_list,ListItem fields, ListList_item values_list,ListItem update_fields, ListItem update_values,enum_duplicates duplic, bool ignore) {while ((values its)){error write_record(thd, table, info, update);} } //写入记录 int write_record(THD *thd, TABLE *table, COPY_INFO *info, COPY_INFO *update) {if (duplicate_handling DUP_REPLACE || duplicate_handling DUP_UPDATE){// ha_write_row 重点是这个函数while ((errortable-file-ha_write_row(table-record[0]))){....}} } 可以看到调用链还是挺深的追到 ha_write_row 方法基本上算是追到头了再往下的话就是 MySql Server 给 Storage Engine提供的接口实现了不信的话继续看呗。。。3 继续挖 ha_write_row int handler::ha_write_row(uchar *buf) {MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,{ error write_row(buf); }) }//这是一个虚方法 virtual int write_row(uchar *buf __attribute__((unused))){return HA_ERR_WRONG_COMMAND; } 看到没有write_row是个虚方法也就是给底层方法实现的在这里就是给各大Storage Engines的哈。????????????3. 调用链图这么多方法看起来有点懵懵的吧我来画一张图帮助大家理解下这个调用堆栈。三总结大家一定要熟读架构图有了架构图从源码中找信息就方便多了总之学习mysql成就感还是满满的????。
http://www.lebaoying.cn/news/134385.html

相关文章:

  • 内蒙古做网站找谁上海进出口博览会
  • 没有网站怎么做外贸搜索网站的设计与建设
  • 网站开发设计工程师职责简介又拍 wordpress
  • 只能在线观看的电影网站咋么做纺织行业网站怎么做
  • 出口退税在哪个网站做博客推广工具
  • 潍坊网站建设哪家强怎么判断一个公司是不是外包公司
  • 网站建设备案计划书招聘网站建设公司
  • 怎么用微信官方网站做二维码河北网站推广公司
  • ps制作网站首页教程outlook企业邮箱官网
  • 个人网站备案条件做个外贸网站
  • 佛山微网站推广网站建设需要了解哪些信息
  • 冒险岛2做乐谱网站html学校网站模板
  • 网站怎么做动态背景图片路边社 wordpress
  • 网站刷单账务处理怎么做wordpress模板网站模板
  • 长沙网站搜索引擎优化WordPress判断设备
  • jsp和php哪个做网站快dede企业网站模板
  • 专业网站设计制作自助建站系统下载
  • 湖北营销网站建设联系方式推荐优秀网站
  • 温州市城市建设学校网站群晖 卸载wordpress
  • 永嘉营销网站建设wordpress添加追番
  • 思科网站建设配置站点dns服务河北婚庆网站建设定制
  • 企业建站公司流程泰州市建设工程质量监督站网站
  • 网站设网站设计网站数据库访问
  • 网站建设专业团队图片中小企业网络规划与设计论文
  • 如何查到别人的网站做哪些竞价词越秀建设网站
  • 爱星光(istar)高端网站建设网站做的比较好的
  • 伍菲网站建设网站建站卡顿怎么办
  • 专业网站建设模板丹东市做网站
  • 万互网站建站门窗设计软件免费版
  • 建筑工程资料网站知名的咨询行业网站制作