乐于分享
好东西不私藏

你给 Spark 一张 Excel 表,它看到的是整个宇宙——DataFrame

你给 Spark 一张 Excel 表,它看到的是整个宇宙——DataFrame

上一篇,你在自己的电脑上亲手启动了 SparkSession,用 explain() 看穿了 Catalyst 的城府,感受了那条"Transformation 写了一堆但啥也没发生"的沉默分界线。

你已经知道了:Driver 是军师,Executor 是士兵,懒惰求值是全局优化的前提。

很好。

但今天我要告诉你一个残酷的事实——光懂这些,你面对真实世界的结构化数据,依然会撞墙。

为什么?因为你手里还缺一个武器。

你现在操作数据用的是 RDD——Spark 最底层的抽象。它强大、灵活,但有一个致命短板:它不认识"表格"。

在它眼里,你的数据就是一坨不透明的对象。一行行的 Python 对象、Java 对象,Spark 完全不知道里面有几列、每列什么类型、列和列之间什么关系。

这就好比你把一份采购清单递给总厨师长,但清单上写的全是密文。总厨能安排厨师干活吗?能。但他能优化备菜方案吗?不能。 因为他看不懂你要的到底是什么。

而 DataFrame,就是那把让总厨师长突然"开天眼"的东西。

今天这篇不急着教 API。我们先搞清楚一个更根本的问题:为什么需要 DataFrame?它到底改变了什么?

pandas 能扛,RDD 能扛,但都扛不到终点

在聊 DataFrame 之前,我们先把两个老朋友摆上台面,看看它们各自的死穴。

pandas:单机王者的天花板

pandas 你肯定熟。pd.read_csv 一把梭,df.groupby 一把聚,链式操作行云流水。

说实话,在单机场景下,pandas 可能是地球上手感最好的数据处理工具之一。

但它有一个基因层面的限制:所有数据必须塞进单机内存。 50GB 的日志? Out of Memory,直接暴毙。这个问题我们第一篇就聊过了。

不过今天我要说的不是内存问题。就算你的数据只有 500MB,pandas 也不是完美的。

因为它的操作模式是可变的、命令式的

df = pd.read_csv("data.csv")
df["new_col"] = df["age"] * 2# 原地修改!
df.drop("old_col", axis=1, inplace=True)  # 又是原地修改!

你看到了吗?df 这个对象在被反复"手术"。每一行代码都在改变它的状态。

在单机环境下,这没什么问题。但在分布式环境下,这是灾难性的设计——如果你的数据散落在 40 台机器上,你说"原地修改",到底改的是哪台机器上的那份?其他 39 台怎么同步?一台改完了另一台还没改,这时候有人来读数据,读到的是改之前的还是改之后的?

这就是分布式系统里经典的一致性噩梦

pandas 从来不需要考虑这个问题,因为它的世界里只有一台机器、一份数据、一个线程。但 Spark 的世界不是这样的。

RDD:分布式老兵的短板

那 RDD 呢?RDD 是 Spark 最早的核心抽象,全称 Resilient Distributed Dataset——弹性分布式数据集。

它完美解决了分布式的问题:数据被切成 Partition 分散在集群中,通过 lineage 实现容错,通过懒惰求值实现全局优化。上一篇我们讲的那些架构优势,RDD 全都有。

而且 RDD 天生是不可变的。每次操作都返回一个新的 RDD,原来的不动。这在分布式环境下是正确的设计——不存在"改了一半"的中间状态。

但 RDD 有一个要命的问题:它是个"黑盒子"。

rdd = sc.textFile("data.csv")
rdd = rdd.map(lambda line: line.split(","))
rdd = rdd.filter(lambda row: int(row[2]) > 25)

你看这段代码——lambda line: line.split(",") 和 lambda row: int(row[2]) > 25

Spark 能看懂这些 lambda 在干什么吗?

不能。

对 Spark 来说,这些就是一个个黑盒函数。它知道你要 map,知道你要 filter,但它完全不知道你在 map 里做了什么、在 filter 里比较了哪一列。

这意味着什么?意味着 Catalyst 优化器完全使不上力。

回忆一下上一篇:Catalyst 能做谓词下推——把 filter 推到数据源头,从 Parquet 文件层面跳过不需要的数据。但前提是它得知道你的 filter 条件是什么。lambda row: int(row[2]) > 25?对不起,Catalyst 看不懂 Python lambda。它只能老老实实地把所有数据都读进来,然后一行一行地调用你的函数。

列裁剪?Catalyst 想帮你只读需要的列,但你用 RDD 操作的是一整行(一个 list 或一个 tuple),Catalyst 根本不知道你最终需要哪几列。

用人话说:RDD 的思维模式是"怎么做"(How)——你必须手把手告诉 Spark 每一步的具体操作。而 Spark 的优化器需要你告诉它"要什么"(What),它才能施展拳脚。

所以,RDD 和 pandas 在面对海量结构化数据时,撞上了同一面墙,只是角度不同:

痛点
pandas
RDD
能分布式吗?
❌ 单机内存限制
✅ 天生分布式
能自动优化吗?
❌ 无优化器
❌ 黑盒函数,优化器无从下手
思维模式
命令式:怎么做
命令式:怎么做
数据可变性
可变,原地修改
不可变 ✅

看到了吗?那一行——"思维模式"那一行,两个都是"命令式"。 这才是根本问题。

这就引出了三个灵魂拷问:

  1. 如何让分布式系统真正"理解"表格结构? 不是黑盒地搬运数据,而是知道你的表有哪些列、每列什么类型。
  2. 如何把优化责任从开发者转移给系统? 不要让我手动调 Shuffle、手动选 Join 策略、手动决定读哪些列。
  3. 如何从"告诉系统怎么做"转向"告诉系统要什么"? 从命令式转向声明式。

这三个问题的答案,就是 DataFrame。

DataFrame 的本质:不是"分布式 pandas",是给 Spark 装上了一个关系型大脑

很多人第一次听到 Spark DataFrame,脑子里冒出的画面是:"哦,就是一个能分布式跑的 pandas 呗。"

这个理解,错得离谱。

如果 DataFrame 只是"分布式 pandas",那它跟 Dask DataFrame 有什么区别?跟 Modin 有什么区别?

Spark DataFrame 的本质是:一个分布式的、带 Schema 的、不可变的表格抽象,并且——这是最关键的——它的每一个操作都会被转化为 Catalyst 优化器能理解的逻辑计划。

逐个拆解:

分布式——数据像 RDD 一样被切成 Partition,散布在集群的多个 Executor 上。这个你已经懂了。

带 Schema——这是 DataFrame 和 RDD 最本质的区别。Schema 就是"表头":列名、列类型、列的顺序。当你创建一个 DataFrame 的时候,Spark 知道你的数据有哪些列、每列是 string 还是 int 还是 double。

这意味着什么?意味着 Spark 不再是一个搬运黑盒的苦力,而是一个理解数据结构的智能系统

回到大后厨的比喻——以前你递给总厨师长的是一张用密文写的菜单,总厨只能机械地安排人手。现在,你递的是一张标准化的菜单:菜名、食材、份量、口味偏好,一清二楚。总厨一看就知道哪些菜可以共享备菜、哪些食材可以批量采购、哪道菜该先做哪道菜该后做。

Schema 就是那张"明文菜单"。有了它,Catalyst 才能真正施展全局优化。

不可变——任何操作都不会修改原来的 DataFrame,而是返回一个全新的 DataFrame。这一点和 RDD 一样,但和 pandas 完全不同。

这个特性为什么重要,我们马上就聊。

不可变:不是"矫情",是分布式世界的生存法则

很多从 pandas 转过来的人,对 DataFrame 的不可变性非常不适应。

# pandas 思维(可变)
df["new_col"] = df["age"] * 2

# Spark DataFrame 思维(不可变)
df_new = df.withColumn("new_col", col("age") * 2)

Spark 里你不能"原地改"一个 DataFrame。每次 filterselectwithColumn,返回的都是一个全新的 DataFrame 对象,原来那个纹丝不动。

你的第一反应可能是:这不是浪费内存吗?每操作一次就复制一份?

不。这里有一个关键的认知:Spark 的 DataFrame 不存储数据,它存储的是"计划"。

回忆一下懒惰求值——当你写 df.filter(col("age") > 25) 的时候,Spark 并没有真正去过滤数据。它只是创建了一个新的 DataFrame 对象,这个对象内部记录着:"我是从 df 经过一个 filter(age > 25) 变换而来的。"

所以"返回新 DataFrame"的成本极低——它只是在 DAG 上加了一个节点,而不是在内存里复制了一份数据。

但不可变性的真正价值不在于性能,在于分布式环境下的安全性。

想象一下:你的数据散落在 40 台机器上。如果你允许"原地修改",那你面临的问题就是——

  • 一致性:40 台机器上的数据必须同时修改完毕,任何一台落后了都会导致数据不一致。
  • 并发安全:如果多个操作同时修改同一份数据,锁怎么加?分布式锁的开销有多恐怖?
  • 容错:改到一半某台机器挂了,已经改完的那些机器要不要回滚?怎么回滚?

这些问题,每一个都是分布式系统里的地狱级难题。

而不可变性一刀切地把它们全部规避了:既然数据从不被修改,就不存在一致性问题;既然没有写操作,就不需要锁;既然原始数据永远在,容错就是从源头重新算一遍。

这不是"矫情",这是用设计约束换系统可靠性

用生活来类比:可变操作就像你在一份纸质合同上直接涂改——涂到第三页的时候,前两页已经面目全非了,万一涂错了,你连原来写的啥都不知道。不可变操作就像每次修改都重新打印一份新合同,旧的保留存档——任何时候想回溯,都有据可查。

在 AI 快节奏的环境下你可能觉得"打印新合同太慢了"。但在分布式环境下,这种"慢"其实是最快的——因为它省掉了所有分布式锁、一致性协议和回滚机制的开销。

从"告诉它怎么做"到"告诉它要什么"——声明式 API 的威力

好了,现在你知道 DataFrame 带了 Schema,知道它不可变。但它最颠覆的特性还在后面——

声明式 API。

什么是声明式?我用一个对比来说明。

假设你要从一张员工表里,找出所有工资超过 10000 的北京员工的姓名。

命令式(RDD 风格)——你得告诉系统每一步怎么做:

rdd.filter(lambda row: row[3] == "北京")    .filter(lambda row: int(row[4]) > 10000)    .map(lambda row: row[1])

你在指挥系统:先过滤城市,再过滤工资,再取名字。每一步的顺序、每一步的具体操作,都是你定的。

声明式(DataFrame 风格)——你只说你要什么:

df.filter((col("city") == "北京") & (col("salary") > 10000))   .select("name")

你看出区别了吗?

声明式代码里,你没有告诉 Spark "先过滤城市再过滤工资"还是"先过滤工资再过滤城市"。你只是说了条件——城市是北京、工资大于一万——以及你要的结果——名字。

至于执行顺序?用不用索引?先过滤哪个条件更高效?这些全是 Catalyst 的活。

这习惯就像你去餐厅点菜:

命令式 = 你冲进后厨说:"先烧一锅水,水开了把面条放进去,煮三分钟,捞出来过冷水,然后起油锅,爆蒜末……"

声明式 = 你坐在座位上说:"来一碗蒜香拌面,不要辣。"

你觉得厨师更喜欢哪种客人?

声明式的好处不仅仅是"写起来简洁"。更深层的好处是——它给了优化器自由度。

当你用命令式写代码时,执行顺序是你定死的。即使 Spark 知道"先过滤工资再过滤城市更高效"(因为工资条件能过滤掉 95% 的数据),它也不敢擅自改你的顺序——万一你的 lambda 里有副作用呢?万一执行顺序影响结果呢?

但当你用声明式写代码时,你只描述了"要什么",Spark 就可以放心大胆地重排执行顺序、合并操作、下推谓词——因为你没有指定 How,所以 How 的选择权完全在 Catalyst 手里。

这就是从"How"到"What"的思维革命。你放弃了控制权,但换来了优化器的全部火力。

Catalyst 优化器:Spark 脑子里那个"隐形军师"

既然说到声明式 API 的好处是"给优化器自由度",那这个优化器到底有多厉害?

Catalyst 是 Spark SQL 引擎的核心。你写的每一行 DataFrame 操作,最终都会被 Catalyst 处理。它的工作流程可以用四个阶段来概括:

你的代码 → 逻辑计划(Logical Plan)→ 优化后的逻辑计划 → 物理计划(Physical Plan)→ 可执行代码

第一步:解析。 你写了 df.filter(...).select(...).groupBy(...).count(),Catalyst 把它翻译成一棵树——逻辑计划树。这棵树忠实地反映了你的代码意图,没有任何优化。就像你手写了一份需求文档,原封不动。

第二步:优化。 这是 Catalyst 的主场。它会对逻辑计划施加一系列规则(Rule-Based Optimization)和基于代价的优化(Cost-Based Optimization),把你的"需求文档"改写成一份"最优施工方案"。

具体能做什么?举几个最常见的:

  • 谓词下推(Predicate Pushdown):你先写了 join 后写了 filter?Catalyst 帮你把 filter 推到 join 之前甚至推到数据读取阶段。如果你读的是 Parquet 文件,filter 条件可以直接下推到文件的 Row Group 元数据层面——不满足条件的数据块压根不会被读进内存。数据还没进门就被拒了。

  • 列裁剪(Projection Pruning):你的表有 100 列,但后面只用到了 3 列?Catalyst 直接告诉数据源"只给我这 3 列"。对于列式存储格式(Parquet、ORC),这意味着 97% 的 I/O 直接省掉。

  • 常量折叠(Constant Folding)WHERE year = 2025 + 1 在执行前就被优化成 WHERE year = 2026,省掉运行时的无谓计算。

  • Join 策略自动选择:两张表 Join,一张 10GB 一张 50MB(注:Spark 默认的自动广播阈值是 10MB,若调大 spark.sql.autoBroadcastJoinThreshold 配置或手动使用 broadcast Hint,Catalyst 就会结合统计信息选择 Broadcast Join——把小表广播到每个 Executor,避免大规模 Shuffle)。你不用写一行提示,它自己判断。

第三步:生成物理计划。 优化完的逻辑计划被转化为物理执行计划——具体用哪种 Join 算法(SortMergeJoin 还是 BroadcastHashJoin)、Shuffle 怎么做、分区怎么切。

第四步:代码生成。 Tungsten 引擎的 Whole-Stage Code Generation 把物理计划编译成紧凑的 Java 字节码。多个操作被融合成一个函数,数据流过一次就完成所有计算——第一篇里讲的 pipeline fusion,就是在这一步实现的。

记住一件事:这整套优化流程之所以能存在,全靠两个前提——

  1. DataFrame 带了 Schema,所以 Catalyst 知道你的数据结构。
  2. 你用了声明式 API,所以 Catalyst 有权重排和改写你的操作。

如果你用 RDD 的黑盒 lambda,Catalyst 就是个瞎子。这就是 DataFrame 相对于 RDD 最核心的优势——不是语法更简洁,而是让优化器"睁开了眼"。

还记得上一篇你在 explain(True) 里看到的 Parsed Logical Plan 和 Optimized Logical Plan 的巨大差异吗?那就是 Catalyst 在悄悄帮你重写代码。你写的代码和 Spark 实际执行的代码,可能已经面目全非——而这种"面目全非",恰恰是性能提升的来源。

面向列的思维:别再一行一行地想了

理解了 DataFrame 和 Catalyst 之后,还有一个思维转换需要完成——从面向行转向面向列。

pandas 用户在写单机代码的时候,脑子里经常在想"这一行数据":

# 这是 pandas 代码,在 Spark 中直接运行会报 AttributeError!
for index, row in df.iterrows():
if row["age"] > 25:
        do_something(row)

在 Spark 里,你甚至连 iterrows() 都调不了,因为 Spark 根本没有这个方法!如果你硬要把数据拉回 Driver 单机(比如用 toPandas().iterrows() 或 collect())再做逐行遍历,在分布式环境下就是毁灭性的性能灾难。

因为在分布式环境下,"一行数据"可能在集群的任何一台机器上。你逐行遍历,等于让 Driver 一条一条地跨网络取数据——这个速度,比蜗牛还慢。

DataFrame 的正确思维是面向列——你操作的对象不是"一行",而是"一列"。

from pyspark.sql.functions import col, lit, expr

# col() —— 引用一列
df.select(col("name"), col("age"))

# lit() —— 创建一个常量列
df.withColumn("country", lit("China"))

# expr() —— 用 SQL 表达式创建列
df.withColumn("age_group", expr("CASE WHEN age > 30 THEN 'senior' ELSE 'junior' END"))

col("name") 不是在取某一行的 name 值——它代表的是整列 name。你对它的操作(比较、运算、聚合)会被 Catalyst 理解并优化,然后由 Executor 在各自的 Partition 上并行执行。

lit("China") 创建的是一个常量列——每一行都是 "China"。这看起来简单,但它是列表达式体系的重要组成部分,经常用在 withColumn 中给 DataFrame 添加固定值列。

expr() 更强大——你可以在里面写 SQL 表达式。Catalyst 会解析这个表达式字符串,把它纳入逻辑计划,享受和其他 DataFrame 操作一样的优化待遇。

为什么列式思维更适合分布式?三个原因:

第一,并行性。当你说 col("age") > 25,这个操作可以在所有 Partition 上同时进行。每个 Executor 处理自己那份数据的 age 列,互不干扰。行式遍历天然是串行的,列式操作天然是并行的。

第二,优化友好。列表达式是 Catalyst 的"母语"。col("age") > 25 这个条件,Catalyst 看得一清二楚——它可以下推到数据源、可以和其他条件合并、可以做常量折叠。你写 lambda row: row["age"] > 25,Catalyst 啥也看不见。

第三,存储效率。现代的列式存储格式(Parquet、ORC)天生按列组织数据。当你只访问 3 列时,列式存储只读这 3 列的物理文件块,其他 97 列完全不碰。列式思维配合列式存储,I/O 效率拉满。

所以,当你从 pandas 转向 Spark 的时候,最需要改变的不是语法,而是思维模式——别再想"这一行",开始想"这一列"。

DataFrame 从哪来?spark.read 的本质

说了这么多,DataFrame 到底怎么创建?

答案是:spark.read

# 从 CSV 文件
df = spark.read.csv("data.csv", header=True, inferSchema=True)

# 从 Parquet 文件
df = spark.read.parquet("data.parquet")

# 从 JSON 文件
df = spark.read.json("data.json")

# 从数据库
df = spark.read.jdbc(url="jdbc:mysql://...", table="users", properties={...})

# 从内存中的数据
df = spark.createDataFrame([(1"Alice"), (2"Bob")], ["id""name"])

不同的数据源,同一个入口——spark.read。Spark 会根据数据源的不同,使用不同的 Reader 去解析数据、推断(或使用你指定的)Schema、构建 DataFrame。

但这里有一个关键点,很多新手会忽略——

spark.read.csv(...) 本身也是懒惰的(但有一个例外)。

当你执行这行代码的时候,Spark 并不会立刻把整个 CSV 文件读进内存。它做的事情是:

  1. 连接到数据源,读取元信息(文件大小、分区信息、Schema 等)。
  2. 构建一个 DataFrame 对象,记录"我的数据来自这个 CSV 文件,Schema 是这样的"。
  3. 然后就停了。

真正的数据读取,要等到你调用 Action 的时候才会发生。这和前两篇讲的逻辑完全一致——创建 DataFrame 只是在菜单上加了一道菜,真正开火要等到你说"上菜"。

⚠️ 这里有一个生产环境下的“大坑”:如果像上文代码块一样设置了 inferSchema=True,因为 CSV 是无元数据的纯文本,为了自动推断类型,Spark 必须立刻触发一个作业去读取并采样数据。此时,惰性评估(Lazy Evaluation)会遭到破坏!因此,生产中强烈建议手动指定 Schema,这才是让读取操作 100% 保持懒惰的黄金法则。

这也意味着——在没有破坏惰性的前提下,如果你后面的操作只用到了 100 列中的 3 列,Catalyst 在生成物理计划的时候,会直接告诉 Reader "只读这 3 列"。你写了 spark.read.csv(...) 并不意味着 Spark 会读整个文件。它读多少,取决于你后面要什么。

这种"数据源也参与优化"的能力,叫做 Data Source API。Parquet、ORC、Delta Lake、Iceberg 这些现代数据格式都深度支持这个 API——它们能向 Catalyst 暴露丰富的元数据(分区信息、统计信息、列的 min/max 值),让优化器做出更精准的决策。

CSV 就相对惨一些——它是纯文本格式,没有内建的列式存储、没有统计信息、没有分区元数据。所以对 CSV 文件的优化空间天然有限。这也是为什么在生产环境中,大家普遍推荐用 Parquet 而不是 CSV——不是因为 Parquet 看起来更高级,而是因为它能让 Catalyst 的优化火力全开。

停一停,回头看

写到这里,让我们把今天的内容串起来。

我们从一个问题出发——为什么 pandas 和 RDD 在面对海量结构化数据时会撞墙?

答案是:它们都陷在了"命令式思维"里。pandas 是可变的、单机的、命令式的。RDD 是不可变的、分布式的,但操作是黑盒的、命令式的。两者都无法给优化器足够的信息来做全局优化。

然后我们理解了 DataFrame 的本质——它不是"分布式 pandas",而是一个带 Schema、不可变、声明式的表格抽象。

  • Schema 让 Spark 看懂了你的数据结构,Catalyst 从此"睁开了眼"。
  • 不可变性 让分布式环境下的一致性、并发和容错问题一刀切地消失了。
  • 声明式 API 让你只说"要什么",把"怎么做"的决策权交给了 Catalyst。
  • 列式思维 让操作天然可并行、优化友好、存储高效。

而 Catalyst 优化器,就是把这些优势落地的那个"隐形军师"——逻辑计划、优化、物理计划、代码生成,四步把你的"需求"变成"最优执行方案"。

这就是 DataFrame 带来的思维革命——从"我来指挥计算"变成"我来描述需求,系统来找最优解"。

💡 题外话:DataFrame 这主意,到底是谁想出来的?

聊到这,估计有学友会好奇:这个把我们折腾得够呛、又牛逼闪闪的 DataFrame 思路,到底是哪位神仙一拍大腿想出来的?

其实,它还真不是 Spark 原创的,而是一场长达三十年的“思想接力”。

最早的源头,可以追溯到 1991 年的 S 语言(贝尔实验室的 John Chambers 等人开发的统计学语言)。为了把各种不同类型(字符、数字、布尔)的数据整整齐齐地塞进一个“大框子”里,他们第一次捣鼓出了 data.frame 这个概念。

后来,S 语言的开源继承者 R 语言 把这个概念发扬光大,成了统计学界的标配。

再到 2008 年,一个叫 Wes McKinney 的华尔街量化分析师,因为实在受够了 Python 里缺乏好用的表格工具,决定“抄”一把 R 语言的作业,于是开发了 pandas。从此,DataFrame 成了 Python 数据分析的代名词。

最后,到了 2015 年的 Spark 1.3 时代,Databricks 的 Reynold Xin(辛湜) 和 Michael Armbrust 等大佬一看:既然大家都熟悉 DataFrame,我们干脆把 Spark 原来那个生涩的 SchemaRDD 改个名,套上 DataFrame 的壳,并把底层的 Catalyst 优化器彻底打通!

所以你看,DataFrame 的本质,是学术界的元老设计(S/R),经过工业界(pandas)的洗礼,最终在分布式计算领域(Spark)迎来的终极合体。

尾声:给系统一点"信任额度"

写到最后,我想说一个心态层面的东西。

从 pandas 转到 Spark 的开发者,心里有一种根深蒂固的不安全感——"我不亲手控制每一步,怎么能放心?"

这种感觉我完全理解。

在 pandas 里,你是全权指挥官。每一行代码做了什么、数据变成了什么样,一清二楚。那种掌控感是真实的、踏实的。

来到了 Spark 的世界,你必须学会做一件事——信任系统。

你告诉 Catalyst "我要北京员工里工资最高的那个人的名字",然后你放手。Catalyst 自己决定先过滤城市还是先过滤工资、用 SortMergeJoin 还是 BroadcastHashJoin、读多少列、跳过多少数据块。

这不是失控。这是更高层次的控制

你从"控制每一步怎么走"变成了"控制目标是什么"。就像一个成熟的管理者,不会告诉团队"先开 VS Code,然后打开 terminal,然后输入 git pull"——他会说"把这个功能上线",然后相信团队会找到最优路径。

当然,信任不是盲目的。explain(True) 就是你的"信任验证工具"——你可以随时看看 Catalyst 到底做了什么优化,看看物理计划是否合理。信任,但要验证。

说到底,DataFrame 带来的不只是一套 API,而是一种思维方式的升级——

从"我来干"变成"我来说,系统来干"。

从微观操控变成宏观描述。

从手工优化变成系统优化。

这个转变,在技术上叫"从命令式到声明式"。在职场上嘛……大概叫"从干活的变成提需求的"。

好了不扯了。

今天就到这里,我是幽皇,咱们下篇见。

相关阅读
Spark 系列一: Spark 为什么非得"懒"?——你以为的偷懒,其实是分布式计算最深的城府
Spark 系列二:你写了十行 Spark 代码,一行都没跑——新手第二课,从"懒"到"真正能用"
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-06 00:05:07 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/717776.html
  2. 运行时间 : 0.208078s [ 吞吐率:4.81req/s ] 内存消耗:4,652.86kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=bbc923efb2aa8708861fd557dc1cc4b0
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001097s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001565s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000716s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000667s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001476s ]
  6. SELECT * FROM `set` [ RunTime:0.001726s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001692s ]
  8. SELECT * FROM `article` WHERE `id` = 717776 LIMIT 1 [ RunTime:0.001679s ]
  9. UPDATE `article` SET `lasttime` = 1780675507 WHERE `id` = 717776 [ RunTime:0.002890s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000641s ]
  11. SELECT * FROM `article` WHERE `id` < 717776 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001190s ]
  12. SELECT * FROM `article` WHERE `id` > 717776 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001094s ]
  13. SELECT * FROM `article` WHERE `id` < 717776 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000700s ]
  14. SELECT * FROM `article` WHERE `id` < 717776 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001764s ]
  15. SELECT * FROM `article` WHERE `id` < 717776 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000616s ]
0.212137s