解析mysql的启动过程

有一天,两个不懂mysql内核的人想去了解mysql内核代码,两个人不是去调试代码、查找资料,而是在那边思考。因为不了解内核,所以边思考边去验证。
使用的mysql代码是5.1.7,调试环境是windows平台下的vs2003。
bingxi:“alex,你觉得mysql的启动过程会是什么样的呢?我们以银行为例吧。”
alex:“嗯,bingxi。早上银行开门了,会先准备好环境,然后开门迎客,mysql也是这样。mysql里面会有一个handle_connections_sockets函数,这个函数就好比是个叫号机,每个用户来了都会取个号,然后就会进行业务处理。”

pthread_handler_t handle_connections_sockets(void *arg attribute((unused))){  ……  while (!abort_loop)  {    select((int) max_used_connection,&readFDs,0,0,0) < 0) //有连接了则往下来执行,否则一直等待    ……    accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),&length)  //接受请求    ……    create_new_thread(thd);  }  //abort_loop=1,则执行到这里进行推出。今天业务不处理了}

Bingxi:“啊,这里面存在两种可能的,1)用户来一个就分配一个工作人员处理,2)将排号的人丢进工作队列,根据叫号机到指定窗口获取服务。前者的场景适合于请求量大,并且需要响应速度特别快的情况,但是分配也会有个限制,所谓的最大连接数,这样的情况常见于互联网行业,相应地我们可以看到机器的负载变化范围特别大。同样的,这也是它的一个弊端,假设每个业务都复杂(消耗资源型sql语句),同时处理的话,机器会支撑不住,这时候第二种方法就比较好,这种情况属于事务性场景。”
Alex:“嗯,是的。Mysql选择的是前者,oracle提供两种方法供选择。我们继续往下面的代码看,如果我们配置了线程缓存,且有可用的缓存,则唤醒该线程,否则创建新的线程。”

static void create_new_thread(THD *thd){     if (cached_thread_count > wake_thread)    {      start_cached_thread(thd);    }    else    {      if ((error=pthread_create(&thd->real_id,&connection_attrib,                            handle_one_connection,                            (void*) thd)))  }}

Bingxi:“嗯,老杨。是不是理解银行为客户分配了一个服务人员,在这段期间一直为该客户服务。里面有个代码段,是一直在等用户下命令。但是有可能网络,或者被kill掉了,就像一个人存了100,不断取1块钱一样,被保安带走了。”

pthread_handler_t handle_one_connection(void *arg){    while (!net->error && net->vio != 0 &&           !(thd->killed == THD::KILL_CONNECTION))    {      net->no_send_error= 0;      if (do_command(thd))       break;    }}

Alex:“嗯,获取命令,然后执行命令。在dispatch_command函数中,根据不同的客户请求进行响应的处理,比如开账户、存钱等”

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

bool do_command(THD *thd){   if ((packet_length=my_net_read(net)) == packet_error) //获取命令   DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));}

          

以上就是解析mysql的启动过程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/416679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
戴尔电脑无线网卡工作原理及信号优化技巧
上一篇 2025年11月7日 01:36:13
《艾尔登法环:黑夜君临》超长实机演示 合作打怪!
下一篇 2025年11月7日 01:36:17

相关推荐

  • Linux如何监控服务的运行时间和负载

    Linux如何监控服务的运行时间和负载Linux如何监控服务的运行时间和负载Linux如何监控服务的运行时间和负载Linux如何监控服务的运行时间和负载

    要监控Linux服务的运行时间和负载,需选择合适的工具并配置监控与告警。首先明确监控目标如Web或数据库服务,然后选用top、ps、sar等命令行工具或Prometheus、Grafana、Nagios等系统级方案。使用top可实时查看CPU和内存占用;ps结合grep和STIME可查进程启动时间;…

    2026年9月12日 用户投稿
    000
  • mysql如何测试事务一致性

    答案:测试MySQL事务一致性需验证ACID特性,首先创建InnoDB表并模拟转账事务,确保余额总和不变;其次通过人为报错测试回滚后数据是否复原;接着在并发场景下检验隔离性,防止超扣;再用自动化脚本模拟多线程操作,校验最终一致性;最后通过kill进程测试崩溃后已提交事务的持久性。 测试 MySQL …

    2026年9月12日
    000
  • 如何在mysql中设置单主多从架构

    首先配置主库启用binlog并创建复制用户,然后为每个从库设置唯一server-id并配置连接主库的复制参数,最后验证各从库的Slave_IO_Running和Slave_SQL_Running状态为Yes,确认数据同步正常。 在 MySQL 中实现单主多从架构,主要是通过配置主从复制(Replic…

    2026年9月12日
    000
  • 如何升级多源复制环境

    先升级从库再逐个升级主库,确保数据一致性。需确认拓扑结构、版本兼容性及GTID设置,备份配置文件并在测试环境验证。停止从库复制线程后升级软件,重启并监控复制状态。每次仅升级一个主库,切换流量、待binlog消费完后关闭升级,检查参数并恢复连接。使用pt-table-checksum校验数据,避免并发…

    2026年9月12日
    100
  • 如何在mysql中查看事件调度器日志

    要监控MySQL事件调度器,需确保event_scheduler=ON,并通过information_schema.EVENTS查看事件状态,启用通用查询日志记录执行过程,检查错误日志排查问题,推荐创建日志表记录事件执行详情,以全面掌握事件行为。 MySQL 本身不提供专门的“事件调度器日志”文件,…

    2026年9月12日
    000
  • 如何在mysql中高效使用SELECT语句

    避免SELECT *,只查询必要列以减少I/O和网络开销;2. 在WHERE条件中使用索引字段并避免函数操作以防止索引失效;3. 用主键或唯一键进行分页优化,避免大偏移量导致性能下降。 在MySQL中高效使用SELECT语句,关键在于优化查询逻辑、合理利用索引以及减少不必要的数据处理。以下是一些实用…

    2026年9月12日
    000
  • 如何使用mysql实现新闻发布系统项目

    核心是设计新闻、分类、用户、评论表并建立关联,通过SQL实现增删改查,用预处理语句防范注入,构建完整系统。 用MySQL做新闻发布系统,核心是把新闻内容和用户操作变成数据库里的“记录”。关键在于设计好数据表,让它们能准确描述新闻、分类、用户这些信息,以及它们之间的关系。只要表结构合理,增删改查就很简…

    2026年9月12日
    100
  • 如何在mysql中优化批量写入效率

    使用批量INSERT、显式事务、调整InnoDB参数、优先LOAD DATA INFILE及优化索引策略可显著提升MySQL写入效率,核心是减少I/O与事务开销。 在 MySQL 中进行批量写入时,如果处理不当,很容易导致性能低下。优化批量写入效率可以从多个方面入手,核心目标是减少磁盘 I/O、降低…

    2026年9月12日
    000
  • 如何使用mysql设计订单支付系统

    答案:设计可靠订单支付系统需合理设计order_info和payment_log表结构,使用DECIMAL存储金额,通过事务保证ACID,结合状态机控制订单状态转换,利用唯一索引防重复,加锁与WHERE条件校验防止并发问题,记录支付日志并定期对账,确保数据一致性与系统可扩展性。 设计一个可靠的订单支…

    2026年9月12日
    000
  • 如何在Linux中优化mysql启动参数

    根据服务器硬件和业务负载调整MySQL内存与I/O参数可显著提升性能。1. 内存方面:innodb_buffer_pool_size设为物理内存50%~70%,key_buffer_size针对MyISAM表设小值(32M~64M),query_cache_size在旧版本中按需启用,tmp_tab…

    2026年9月12日
    000
  • MySQL海量历史数据表结构设计与优化指南

    本文旨在为处理大量历史数据的MySQL数据库提供表结构设计与优化策略。我们将探讨如何高效存储和检索数百万乃至数十亿条交易记录,重点关注主键设计、实体关系建模以及数据摄入方式,确保系统在面临大规模数据时仍能保持卓越的查询性能和可扩展性。 1. 理解数据规模与MySQL限制 在设计数据库结构时,首先要对…

    2026年9月12日
    000
  • 如何在mysql中理解MyISAM存储引擎特点

    MyISAM不支持事务和崩溃恢复,采用表级锁,写操作阻塞所有读写,但查询速度快,适合读多写少、无需事务的场景如日志记录、报表系统和全文搜索应用。 MyISAM 是 MySQL 早期默认的存储引擎,虽然现在 InnoDB 更为主流,但在某些特定场景下 MyISAM 依然有其应用价值。理解它的特点有助于…

    2026年9月12日
    100
  • 如何在mysql中使用IFNULL和COALESCE处理空值

    IFNULL函数用于处理单个字段的空值,当该字段为NULL时返回指定默认值;COALESCE函数可处理多个字段,返回第一个非NULL值,适用于多字段取有效值场景。两者均可替换NULL值,但IFNULL仅支持两个参数且为MySQL特有,COALESCE符合SQL标准并支持多参数,选择应基于实际需求以提…

    2026年9月12日
    100
  • Sublime开发MySQL数据接口分页功能_适用于大数据集展示的性能优化

    Sublime开发MySQL数据接口分页功能_适用于大数据集展示的性能优化Sublime开发MySQL数据接口分页功能_适用于大数据集展示的性能优化Sublime开发MySQL数据接口分页功能_适用于大数据集展示的性能优化Sublime开发MySQL数据接口分页功能_适用于大数据集展示的性能优化

    分页功能在mysql大数据集中需避免传统limit大offset查询,1. 传统分页性能瓶颈在于扫描大量数据后丢弃,效率低;2. 游标分页通过上一页最后一条记录的id进行下一页查询,跳过大量数据扫描;3. 结合索引优化,确保排序字段有索引或联合索引提升查询速度;4. 控制每页数据量在10~50条之间…

    2026年9月12日 用户投稿
    100
  • mysql迁移后如何重新配置用户权限

    迁移后用户权限需手动配置,首先检查mysql.user表中用户是否存在;若缺失,推荐通过备份恢复权限,使用mysqldump导出原库的mysql系统表并导入新实例,执行FLUSH PRIVILEGES生效;若无备份,则手动创建用户并授权,使用CREATE USER和GRANT语句按需分配权限,完成后…

    2026年9月12日
    000
  • 如何在mysql中备份分区表

    使用mysqldump可备份MySQL分区表,自动保留分区结构和数据,结合–single-transaction等选项确保一致性;物理备份可用Percona XtraBackup实现高效热备,支持完整恢复分区元数据和ibd文件。 在 MySQL 中备份分区表,本质上和备份普通表方法一致,…

    2026年9月12日
    200
  • 如何在mysql中使用COUNT统计满足条件的记录

    使用WHERE、CASE、IF和COUNT(DISTINCT)可实现MySQL中灵活的条件计数,关键是利用COUNT只计非空值的特性,准确统计目标记录。 在 MySQL 中,COUNT() 函数用于统计查询结果中的记录数量。当你需要统计满足特定条件的记录时,可以通过结合 CASE 语句、IF 函数或…

    2026年9月12日
    000
  • 如何在mysql中开发任务分配管理系统

    答案:基于MySQL设计任务分配系统需构建用户表和任务表,通过assignee_id关联实现任务分配;利用SQL完成任务的增删改查操作;结合角色字段控制权限,管理员可管理所有任务,普通成员仅限个人任务;支持项目分类、评论、日志等扩展功能,并在关键字段创建索引以提升查询性能。 在 MySQL 中开发任…

    2026年9月12日
    100
  • Linux怎么查看所有已安装的服务列表

    Linux怎么查看所有已安装的服务列表Linux怎么查看所有已安装的服务列表Linux怎么查看所有已安装的服务列表Linux怎么查看所有已安装的服务列表

    在Linux系统里,想知道到底有哪些服务在跑,或者哪些服务准备开机启动,这其实是个很基础但又很关键的问题。简单来说,最直接的办法就是用 systemctl 命令,它是现代Linux发行版(比如Ubuntu、CentOS、Debian等,只要是基于systemd的)管理服务的主力。敲一个 system…

    2026年9月12日 用户投稿
    100
  • 如何在mysql中使用IF条件函数实现逻辑判断

    MySQL的IF函数用于根据条件返回不同值,语法为IF(条件, 真值, 假值),常用于SELECT、UPDATE、INSERT语句中实现简单逻辑判断,如成绩及格判定、商品状态更新等,支持嵌套实现多分支判断,适用于轻量级条件处理,复杂场景建议使用CASE语句。 在MySQL中,IF 是一个内置的条件函…

    2026年9月12日
    100

发表回复

登录后才能评论
关注微信