当前位置:首页>python>python#022: PyArrow 真正值钱的不是 Parquet,而是把 Python 数据流打通

python#022: PyArrow 真正值钱的不是 Parquet,而是把 Python 数据流打通

  • 2026-07-03 00:11:54
python#022: PyArrow 真正值钱的不是 Parquet,而是把 Python 数据流打通

系列

:Python 提效工具 100 篇 · 第 022 篇
版本:pyarrow 23.0.1 · Python ≥ 3.10
难度:⭐⭐⭐
关键词:Arrow、列式内存、Parquet、Dataset、Pandas、DuckDB


你以为自己在学文件格式,其实是在补一层“数据总线”

很多人第一次接触 PyArrow,都是因为 Parquet。

场景通常是这样的:

  • 先用 Pandas 读 CSV
  • 中间转成 Parquet 存盘
  • 再给 DuckDB、Spark、Polars 或别的系统继续处理
  • 最后又回到 Pandas 或 Python 对象

表面上你在折腾的是“文件格式”,真正一直在消耗时间和内存的,却是数据在不同工具之间反复搬运、反复拷贝、反复丢类型信息

PyArrow 真正值钱的地方,不是会写 Parquet,而是它给 Python 世界补上了一层统一的列式数据中间层。

这层中间层一旦建立起来:

  • Pandas 和 Parquet 的边界更清楚
  • DuckDB、Polars、数据湖工具链之间更容易互通
  • 大文件、多文件、分区目录的扫描不必每次都先塞回 DataFrame
  • schema、类型、空值、批次这些本来容易混乱的细节,终于有了更稳定的表达方式

如果你最近正在做本地分析、离线报表、日志巡检、Parquet 数据集、AI 数据预处理,PyArrow 值得认真补上。


PyArrow 是什么

PyArrow 是 Apache Arrow 的 Python 库。官方一句话定位是:Python library for Apache Arrow

但只看这句话太轻了。更准确的理解应该是:

PyArrow 是 Python 里访问 Arrow 列式内存格式、Parquet、Dataset 和高性能列式计算能力的核心入口。

你可以把 Arrow 理解成一套“跨工具、跨语言的列式数据标准件”:

  • Array
    :单列数据
  • Table
    :多列组成的表
  • RecordBatch
    :一批行组成的列式块
  • Schema
    :字段名、类型、元信息
  • Parquet / IPC / Feather
    :这些列式结构的存储或交换形式
  • Dataset
    :多文件、多目录、分区数据集的统一入口

PyArrow 本身不等于 Pandas,也不等于 DuckDB。

  • Pandas 强在 DataFrame 交互式清洗和序列运算
  • DuckDB 强在 SQL 聚合、JOIN、窗口函数
  • PyArrow 强在把这些工具之间的数据通路打通

PyArrow、Pandas、DuckDB 到底怎么分工

一句话判断:

  • 你要洗数据、改列、画图
    :先想 Pandas
  • 你要把数据在多个系统之间顺畅传递
    :先想 PyArrow
  • 你要做聚合、JOIN、窗口函数、报表 SQL
    :先想 DuckDB

安装

pip install pyarrow
pip install pyarrow pandas   # 如果你要演示 DataFrame 互转

PyArrow 轮子比较大,但价值也集中在这里:底层能力不是“纯 Python 凑出来的”,而是直接把 Arrow 生态的核心能力带进 Python。


3 分钟上手:先别急着想 DataFrame,先理解 Table

很多人一上来就想“PyArrow 怎么替代 DataFrame”。

这就是第一层误区。

PyArrow 不该先拿来和 DataFrame 正面硬拼,而应该先理解它的核心数据结构——Table

import pyarrow as pa

schema = pa.schema([
    ("episode", pa.string()),
    ("duration_s", pa.int32()),
    ("score", pa.float64()),
])

table = pa.Table.from_pydict(
    {
        "episode": ["ep001", "ep002"],
        "duration_s": [3200, 2800],
        "score": [9.1, 8.6],
    },
    schema=schema,
)

print(table.schema)
print(table.to_pylist())

输出里最关键的不是数据本身,而是这两件事:

  1. schema 是明确的
    ,不是“跑到哪儿再猜类型”
  2. 列式结构是稳定的
    ,后续写 Parquet、转 Pandas、喂给别的工具都会更顺

五个最值得掌握的核心能力

1. ArrayTableRecordBatchSchema:先建立 Arrow 直觉

最少要先理解这四个词:

  • pa.array(...)
    :一列
  • pa.Table.from_*
    :一张表
  • pa.RecordBatch.from_*
    :一批记录,适合流式或分块处理
  • pa.schema(...)
    :显式定义类型
import pyarrow as pa

names = pa.array(["Alice", "Bob", "Carol"])
scores = pa.array([92, 81, 88])

batch = pa.RecordBatch.from_arrays([names, scores], names=["name", "score"])
table = pa.Table.from_batches([batch])

print(batch.num_rows)
print(table.column_names)

为什么这层直觉很重要?

因为 PyArrow 的很多能力——Parquet、Dataset、跨工具互转、批次扫描——本质上都不是围着“一个胖 DataFrame 对象”转,而是围着这些列式对象转。

2. Table.from_pandas() / to_pandas():和 Pandas 互转,但别盲目迷信“零拷贝”

import pandas as pd
import pyarrow as pa

source_df = pd.DataFrame(
    {
        "episode": ["ep001", "ep002", "ep003"],
        "lang": ["zh", "en", "zh"],
        "duration_s": [3200, 2800, 1500],
    }
)

arrow_table = pa.Table.from_pandas(source_df)
restored_df = arrow_table.to_pandas()

print(arrow_table.schema)
print(restored_df.head())

这一组 API 很常用,但要记住两个边界:

  1. 不是所有转换都天然零拷贝
    to_pandas() 甚至提供了 zero_copy_only=True,意思正说明“能不能零拷贝,要看数据类型和布局是否满足条件”。
  2. object dtype 是类型信息最容易模糊的地方
    。官方文档也明确提醒:object 列往往需要猜类型;如果 DataFrame 为空,或者列里全是 None,类型推断就可能退化成 null

所以更稳的工程写法通常是:

  • 能显式给 schema,就别完全依赖猜测
  • 对关键字段(时间、数值、分类)尽量提前定清类型
  • 真要拿 Arrow 当数据中间层时,尽量少让模糊 object 列到处飘

3. pyarrow.parquet:Parquet 不只是“压缩存盘”,而是列式数据的自然落地形式

import pyarrow as pa
import pyarrow.parquet as pq

summary = pa.table(
    {
        "episode": ["ep001", "ep002", "ep003"],
        "size_mb": [80.5, 68.2, 77.1],
        "status": ["done", "done", "queued"],
    }
)

pq.write_table(summary, "episodes.parquet", compression="snappy")
restored = pq.read_table("episodes.parquet", columns=["episode", "size_mb"])

print(restored.to_pylist())

write_table() / read_table() 是最常见的入口。

这里最值得记住的不是“会写文件”,而是三个判断:

  • Parquet 是列式存储
    ,不是 CSV 那种“全量顺序扫一遍”的心智模型
  • 读 Parquet 时可以按列读、按条件筛,天然更适合分析型负载
  • PyArrow 直接掌握 Parquet 的底层结构,因此它往往是 Python 里处理 Parquet 最直接的一层

官方文档里还能看到 versioncompressionrow_group_size 等参数。

最实用的经验是:

  • 默认先用 compression="snappy"
  • 如果你更看重生态兼容性,Parquet version 不要随便追新
  • 如果后面要被很多下游系统读取,优先选稳而不是炫技

4. pyarrow.dataset:真正把 PyArrow 价值拉开的,是多文件与分区目录

如果你只把 PyArrow 当成“单文件读写工具”,那还是低估了它。

pyarrow.dataset 才是它在工程里真正值钱的一层。

官方文档明确把它定位为:高效处理表格型、可能大于内存、而且往往是多文件的数据集

import pyarrow as pa
import pyarrow.dataset as ds

partition_schema = pa.schema([
    ("day", pa.string()),
    ("lang", pa.string()),
])

source = pa.table(
    {
        "day": ["2026-04-06", "2026-04-06", "2026-04-07"],
        "lang": ["zh", "en", "zh"],
        "episode": ["ep001", "ep002", "ep003"],
        "size_mb": [80.5, 68.2, 77.1],
    }
)

ds.write_dataset(
    source,
    base_dir="episode_dataset",
    format="parquet",
    partitioning=["day", "lang"],
    partitioning_flavor="hive",
)

dataset = ds.dataset(
    "episode_dataset",
    format="parquet",
    partitioning=ds.partitioning(partition_schema, flavor="hive"),
)

filtered = dataset.to_table(
    filter=(ds.field("day") == "2026-04-06") & (ds.field("lang") == "zh"),
    columns=["episode", "size_mb"],
)

print(filtered.to_pylist())

这段代码里真正关键的是:

  • 多文件目录被当成一个逻辑数据集来处理
  • 分区字段可以直接参与过滤
  • 扫描阶段就能做列投影和条件过滤
    ,不用先把全部文件读回内存

这就是官方文档反复强调的几个词:

  • unified interface
  • partition discovery
  • predicate pushdown
  • projection
  • potentially larger than memory

5. pyarrow.compute:在列式对象上直接做高性能计算

很多人只记得 PyArrow 会读写文件,却忘了它还有 compute 模块。

import pyarrow as pa
import pyarrow.compute as pc

durations = pa.array([3200, 2800, None, 1500])
mask = pc.greater(durations, 2000)
filtered = pc.filter(durations, mask)

total = pc.sum(filtered)

print(filtered)
print(total.as_py())

compute 适合做这类事情:

  • 过滤
  • 数值聚合
  • 字符串处理
  • 日期时间处理
  • 布尔掩码运算

但也要有边界感。

如果你已经开始想:

  • 复杂 GROUP BY
  • 多表 JOIN
  • 窗口函数
  • 一整套分析 SQL

那就说明你该往 DuckDB 走了。PyArrow 不是不能算,而是它最强的价值通常不是把自己写成 SQL 引擎,而是把列式数据准备好,交给更合适的下游


一个真实应用例子:播客素材元数据分区数据集

假设你每天都会产出一批播客素材元数据,字段包括:

  • 日期
  • 语言
  • 文件名
  • 时长
  • 大小
  • 转码状态
  • 质检分数

如果继续用 CSV 散着放,会出现几个问题:

  • 多天数据越来越难查
  • 某个语言或某一天的数据要自己拼路径
  • 想给 DuckDB、Pandas、下游脚本复用时,入口不统一

这时很适合让 PyArrow 先把数据层整理干净。

from pathlib import Path

import pandas as pd
import pyarrow as pa
import pyarrow.dataset as ds

records = pd.DataFrame(
    {
        "day": ["2026-04-06", "2026-04-06", "2026-04-07", "2026-04-07"],
        "lang": ["zh", "en", "zh", "zh"],
        "episode": ["ep001", "ep002", "ep003", "ep004"],
        "duration_s": [3200, 2800, 0, 3500],
        "size_mb": [80.5, 68.2, 0.0, 95.3],
        "status": ["done", "done", "failed", "done"],
        "qc_score": [9.2, 8.7, 2.0, 9.5],
    }
)

schema = pa.schema(
    [
        ("day", pa.string()),
        ("lang", pa.string()),
        ("episode", pa.string()),
        ("duration_s", pa.int32()),
        ("size_mb", pa.float64()),
        ("status", pa.string()),
        ("qc_score", pa.float64()),
    ]
)

table = pa.Table.from_pandas(records, schema=schema, preserve_index=False)

base_dir = Path("podcast_arrow_dataset")
ds.write_dataset(
    table,
    base_dir=str(base_dir),
    format="parquet",
    partitioning=["day", "lang"],
    partitioning_flavor="hive",
    existing_data_behavior="delete_matching",
)

partition_schema = pa.schema([
    ("day", pa.string()),
    ("lang", pa.string()),
])

dataset = ds.dataset(
    str(base_dir),
    format="parquet",
    partitioning=ds.partitioning(partition_schema, flavor="hive"),
)

ready = dataset.to_table(
    filter=(ds.field("status") == "done") & (ds.field("lang") == "zh"),
    columns=["day", "episode", "duration_s", "size_mb", "qc_score"],
)

print(ready.to_pandas())

这套写法的价值在于:

  1. 入口统一
    :以后这个目录就是一个数据集,不是若干零散文件
  2. 分区明确
    :按 day/lang 组织,读写都清楚
  3. 类型稳定
    :schema 写死,后面不会“这次是 float,下次又被猜成 string”
  4. 上下游更顺
    :想继续给 Pandas、DuckDB、报表脚本都方便

生产实践里最容易踩的几个点

1. 不要把 object dtype 当成理所当然

Pandas 的 object 列在工程里经常是“先能跑再说”的产物。

但到了 Arrow 世界,类型系统会更严谨。

如果你让 PyArrow 去猜:

  • 空列
  • 全是 None
  • 混着字符串、数字、对象的列

它就可能推断出你并不想要的结果。

关键字段尽量显式 schema。

2. 不要把“零拷贝”当成宣传口号去乱写

PyArrow 确实能显著减少数据在不同工具间的重复拷贝,但“零拷贝”从来不是无条件成立。

真正稳的表述应该是:

  • Arrow 的列式布局让零拷贝或低拷贝变得更有可能
  • 但是否真的零拷贝,要看具体类型、内存布局和目标工具是否兼容
  • 如果你需要严格保证,应该看 API 是否提供显式约束,例如 zero_copy_only=True

3. Dataset 适合扫描,不代表它要取代 SQL 引擎

pyarrow.dataset 非常适合:

  • 目录发现
  • 分区裁剪
  • 列投影
  • 过滤扫描
  • 批次迭代

但如果你的需求已经演化成:

  • 多表 JOIN
  • 窗口函数
  • 复杂统计报表
  • analyst 风格 SQL

那就别硬拧,直接接 DuckDB 更顺。

4. Parquet 参数先保守,再优化

pyarrow.parquet.write_table() 支持非常多参数:

  • compression
  • version
  • row_group_size
  • use_dictionary
  • write_statistics

如果你没有明确基准测试,先用稳妥策略:

  • 压缩先从 snappy 开始
  • 版本优先兼容性,不盲目追最新 logical type
  • row group 调优要建立在真实读取模式上,不要拍脑袋

5. PyArrow 不是用来替代所有上层工具的

PyArrow 最适合作为:

  • 数据格式标准层
  • 列式内存中间层
  • Parquet / Dataset 入口层
  • 跨工具传输层

它不是你所有分析逻辑都要手写在里面的地方。


什么时候应该优先想到 PyArrow

如果只能记住一句话:

PyArrow 最值得学的,不是“又一个数据处理库”,而是它把 Python 数据工作流里最容易断裂的地方接起来了。


SVG 配图说明

本文三张信息图均为自制 SVG(可缩放矢量图形)格式,再转为 PNG 内嵌。SVG 本质上是用代码描述图形的矢量格式,放大不糊、后期易改,特别适合技术文章里的流程图、结构图和对比图。


小结

PyArrow 的价值,不在于它会替你做所有分析,而在于它把 列式内存、Parquet、分区数据集、跨工具互通 这几件原本很散的事情,收成了一条清晰的数据通路。

当你的 Python 数据工作流开始跨越 Pandas、Parquet、DuckDB、Polars、数据湖目录时,越早补上 PyArrow,这条链路越稳。


系列索引:Python 提效工具 100 篇路线图

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 17:54:37 HTTP/2.0 GET : https://f.mffb.com.cn/a/489541.html
  2. 运行时间 : 0.377014s [ 吞吐率:2.65req/s ] 内存消耗:4,678.60kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=567bf86878c1ba5e7b147cfcad54f237
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000419s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000614s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002874s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.005468s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000595s ]
  6. SELECT * FROM `set` [ RunTime:0.001507s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000569s ]
  8. SELECT * FROM `article` WHERE `id` = 489541 LIMIT 1 [ RunTime:0.024115s ]
  9. UPDATE `article` SET `lasttime` = 1783072477 WHERE `id` = 489541 [ RunTime:0.011596s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000326s ]
  11. SELECT * FROM `article` WHERE `id` < 489541 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001082s ]
  12. SELECT * FROM `article` WHERE `id` > 489541 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002638s ]
  13. SELECT * FROM `article` WHERE `id` < 489541 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.130147s ]
  14. SELECT * FROM `article` WHERE `id` < 489541 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.087957s ]
  15. SELECT * FROM `article` WHERE `id` < 489541 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.036202s ]
0.378565s