跳到内容
当前位置:首页>PPT>痛点直击:当你的Tkinter程序卡成PPT时,问题往往出在数据库插入上

痛点直击:当你的Tkinter程序卡成PPT时,问题往往出在数据库插入上

  • 2026-11-06 23:33:46
痛点直击:当你的Tkinter程序卡成PPT时,问题往往出在数据库插入上

在Windows上位机开发圈子里混了这么多年,我发现一个特别有意思的现象:几乎所有用Tkinter写的工业监控软件、数据采集程序,最后都会卡在同一个坑上——批量数据写入SQLite数据库时界面卡死、程序假死、甚至直接崩溃。读完这篇文章,你会掌握三种从入门到进阶的批量插入优化方案,把插入10万条数据的耗时从分钟级压缩到秒级,顺带解决Tkinter主线程被数据库操作阻塞的老大难问题。

下面咱们就用真实场景、可运行代码和实测数据,把这件事彻底说清楚。

🔍 问题深度剖析:为什么你的插入速度这么慢

很多做上位机开发的朋友,第一次写数据采集程序时都会踩这个坑:用for循环逐条执行INSERT语句,代码看起来没毛病,跑起来却慢得让人绝望。

import sqlite3import timeconn = sqlite3.connect("sensor_data.db")cursor = conn.cursor()cursor.execute("""    CREATE TABLE IF NOT EXISTS readings (        id INTEGER PRIMARY KEY AUTOINCREMENT,        sensor_id TEXT,        value REAL,        timestamp TEXT    )""")start = time.time()for i inrange(10000):    cursor.execute("INSERT INTO readings (sensor_id, value, timestamp) VALUES (?, ?, ?)",        (f"S{i%10}", i * 0.01, "2026-08-15")    )    conn.commit()  # 这里是罪魁祸首print(f"耗时:{time.time() - start:.2f}秒")

在我自己的测试机上(Windows 11,i5-12400,NVMe SSD,Python 3.11,SQLite 3.42),这段代码插入1万条数据大概要18~25秒。这玩意儿要是放在数据采集程序里,传感器每秒上报几十条数据,用户界面早就卡成PPT了。

问题的根源其实不在于INSERT语句本身,而在于事务(transaction)的开销。 SQLite默认每条commit都要做一次磁盘同步(fsync),这个操作在机械硬盘上尤其致命,即便是SSD也逃不过系统调用的开销。更麻烦的是,如果这段代码直接跑在Tkinter的主线程里,mainloop会被彻底阻塞,用户点击按钮没反应,进度条纹丝不动,看起来就是"程序死了"。

我在做产线设备监控项目时就吃过这个亏:客户反馈软件"卡死",排查半天才发现是采集线程往主线程队列里塞数据时,主线程正忙着逐条写库,界面事件循环完全没时间处理。这种问题在测试环境数据量小的时候根本发现不了,一到产线批量跑就原地爆炸。

💡 核心要点提炼:批量插入的底层逻辑

想真正解决这个问题,得先搞明白几个关键机制。

第一,事务边界决定性能天花板。 SQLite每次commit都会触发WAL(Write-Ahead Logging)或回滚日志的落盘操作,这是保证数据一致性的代价。如果把多条INSERT合并到一个事务里,磁盘同步只需要发生一次,性能提升是数量级的。

第二,executemany比手写循环更高效。 Python的sqlite3模块提供了executemany方法,底层做了预编译语句复用(prepared statement),减少了SQL解析的重复开销。

第三,UI线程与数据库线程必须解耦。 Tkinter是单线程GUI框架,任何阻塞操作都会冻结界面。批量插入这种I/O密集型任务,理应放到后台线程执行,通过队列或after()方法把结果同步回主线程。

第四,PRAGMA参数是隐藏的性能开关。synchronous和journal_mode这两个PRAGMA设置,直接决定了SQLite在写入安全性和速度之间的取舍。生产环境要谨慎调整,但在数据采集这种可以容忍极小概率丢失的场景下,适度放宽是合理的权衡。

🚀 解决方案设计:三级递进优化方案

方案一:事务合并 + executemany(性能提升5~8倍)

这是最基础也最应该优先尝试的优化手段,改动成本极低。

import sqlite3import timedefbatch_insert_v1(data_list, db_path="sensor_data.db"):"""使用executemany + 单事务批量插入"""    conn = sqlite3.connect(db_path)    cursor = conn.cursor()    cursor.execute("""        CREATE TABLE IF NOT EXISTS readings (            id INTEGER PRIMARY KEY AUTOINCREMENT,            sensor_id TEXT,            value REAL,            timestamp TEXT        )    """)    start = time.time()    cursor.executemany("INSERT INTO readings (sensor_id, value, timestamp) VALUES (?, ?, ?)",        data_list    )    conn.commit()  # 只提交一次    elapsed = time.time() - start    conn.close()return elapsed# 构造测试数据test_data = [(f"S{i%10}", i * 0.01, "2026-08-15") for i inrange(10000)]print(f"executemany批量插入耗时:{batch_insert_v1(test_data):.3f}秒")

同样的1万条数据,实测耗时从原来的20秒左右压缩到2.8秒,提速接近7倍。这一步几乎是所有Python开发同学都应该掌握的基本功,记住这句话:能合并的事务,绝不逐条commit。

方案二:PRAGMA调优 + WAL模式(性能再提升3~5倍)

在方案一的基础上,我们可以进一步调整SQLite的写入策略。

import sqlite3import timedefbatch_insert_v2(data_list, db_path="sensor_data.db"):"""PRAGMA调优 + WAL模式批量插入"""    conn = sqlite3.connect(db_path)    cursor = conn.cursor()# 关键调优参数    cursor.execute("PRAGMA journal_mode = WAL")      # 写前日志模式    cursor.execute("PRAGMA synchronous = NORMAL")     # 降低fsync频率    cursor.execute("PRAGMA cache_size = -64000")      # 64MB缓存    cursor.execute("PRAGMA temp_store = MEMORY")      # 临时表存内存    cursor.execute("""        CREATE TABLE IF NOT EXISTS readings (            id INTEGER PRIMARY KEY AUTOINCREMENT,            sensor_id TEXT,            value REAL,            timestamp TEXT        )    """)    start = time.time()    cursor.execute("BEGIN TRANSACTION")    cursor.executemany("INSERT INTO readings (sensor_id, value, timestamp) VALUES (?, ?, ?)",        data_list    )    conn.commit()    elapsed = time.time() - start    conn.close()return elapsedprint(f"PRAGMA优化后耗时:{batch_insert_v2(test_data):.3f}秒")

在相同测试环境下,这个版本插入1万条数据的耗时能压到0.6~0.9秒左右。这里有个踩坑预警:synchronous = OFF虽然速度最快,但断电或系统崩溃时可能丢数据甚至损坏数据库文件,工业现场慎用,NORMAL是相对安全且够快的折中方案。另外journal_mode = WAL会在数据库同目录下生成-wal和-shm文件,如果程序需要拷贝或迁移数据库,记得先执行PRAGMA wal_checkpoint(FULL)把日志合并回主文件。

方案三:多线程解耦,彻底解放Tkinter主线程

前两个方案解决了插入速度问题,但如果这段代码还是跑在Tkinter主线程里,界面依然会短暂卡顿。真正的工业级方案,是把数据库操作丢到独立线程,通过队列与主线程通信。

import tkinter as tkfrom tkinter import ttkimport sqlite3import threadingimport queueimport timeclassDataCollectorApp:def__init__(self, root):self.root = rootself.root.title("批量数据采集 - 实战示例")self.root.geometry("420x220")self.progress = ttk.Progressbar(root, length=350, mode="determinate")self.progress.pack(pady=20)self.status_label = tk.Label(root, text="等待开始...")self.status_label.pack(pady=5)self.start_btn = tk.Button(root, text="开始批量写入", command=self.start_task)self.start_btn.pack(pady=10)self.result_queue = queue.Queue()self._poll_queue()defstart_task(self):self.start_btn.config(state="disabled")self.status_label.config(text="正在写入数据库...")# 后台线程执行数据库操作,不阻塞界面        worker = threading.Thread(target=self._db_worker, daemon=True)        worker.start()def_db_worker(self):        conn = sqlite3.connect("sensor_data.db", check_same_thread=False)        cursor = conn.cursor()        cursor.execute("PRAGMA journal_mode = WAL")        cursor.execute("PRAGMA synchronous = NORMAL")        cursor.execute("""            CREATE TABLE IF NOT EXISTS readings (                id INTEGER PRIMARY KEY AUTOINCREMENT,                sensor_id TEXT, value REAL, timestamp TEXT            )        """)        total = 50000        batch_size = 5000        data = [(f"S{i%10}", i * 0.01, "2026-08-15") for i inrange(total)]        start = time.time()for i inrange(0, total, batch_size):            chunk = data[i:i + batch_size]            cursor.executemany("INSERT INTO readings (sensor_id, value, timestamp) VALUES (?, ?, ?)",                chunk            )            conn.commit()# 把进度回传给主线程,而不是直接操作UI组件self.result_queue.put(("progress", (i + batch_size) / total * 100))        conn.close()        elapsed = time.time() - startself.result_queue.put(("done", elapsed))def_poll_queue(self):"""主线程定期检查队列,安全更新UI"""try:whileTrue:                msg_type, payload = self.result_queue.get_nowait()if msg_type == "progress":self.progress["value"] = payloadelif msg_type == "done":self.status_label.config(text=f"写入完成,耗时 {payload:.2f} 秒")self.start_btn.config(state="normal")except queue.Empty:passself.root.after(100, self._poll_queue)  # 100ms轮询一次if __name__ == "__main__":    root = tk.Tk()    app = DataCollectorApp(root)    root.mainloop()

这个版本我在实际的产线数据采集软件里用过类似结构,5万条数据分批(每批5000条)写入,界面进度条流畅滚动,用户点击、拖拽、切换窗口都完全不受影响。这里的关键设计是:数据库线程绝不直接操作Tkinter组件,所有UI更新都通过queue传递、由主线程的after()轮询消费,这是Tkinter多线程编程的黄金法则,违反它会导致偶发的"程序无响应"或崩溃,而且极难复现和调试。

📊 三种方案实测数据对比

测试环境:Windows 11 Pro,Intel i5-12400,32GB内存,NVMe SSD,Python 3.11.6,SQLite 3.42.0(Python内置版本)。

方案
数据量
耗时
相对提速
逐条insert+commit
1万条
约20.3秒
基准
executemany+单事务
1万条
约2.8秒
约7.3倍
PRAGMA调优+WAL
1万条
约0.7秒
约29倍
多线程分批写入
5万条
约3.6秒
界面零卡顿

数据说明一切:中间件层面的批量处理策略,比单纯升级硬件的性价比高得多。这也是我一直跟团队里新人强调的一个观点——写Python代码遇到性能问题,先别急着优化算法或者换语言,往往是数据库交互方式没设计对。

🌟 三句话总结这篇文章的核心洞察

一句话总结一:批量插入的本质,是用一次磁盘同步换取成千上万次逻辑写入,事务合并永远是第一优化手段。

一句话总结二:PRAGMA参数是SQLite性能与安全性的天平,工业场景下NORMAL级别的synchronous通常是最优解。

一句话总结三:Tkinter程序卡顿九成源于主线程被I/O操作阻塞,队列+多线程是唯一靠谱的解耦方式。

上面方案二和方案三的代码结构,可以直接作为数据采集类上位机项目的模板复用,把表结构和采集逻辑替换成自己的业务字段就能跑起来。

💬 留给大家的两个讨论话题

第一个问题:如果你的项目数据量已经涨到百万级甚至千万级,SQLite的单文件架构会不会成为新的瓶颈?这时候是继续深挖SQLite的优化空间,还是应该考虑迁移到PostgreSQL或者其他方案,欢迎在评论区聊聊你的判断依据。

第二个问题:在你实际做过的上位机或数据采集项目里,除了数据库写入,还有哪些操作容易在不经意间阻塞Tkinter主线程?大家可以分享一下踩过的坑和解决思路。

🎯 写在最后

回顾一下今天的三个核心收获:第一,事务合并是批量插入优化的地基,用executemany加单次commit能带来数量级的提速;第二,PRAGMA参数调优是SQLite性能优化的隐藏杠杆,journal_mode和synchronous的合理配置能进一步压榨性能;第三,多线程解耦是Tkinter程序稳定性的关键,任何耗时操作都不该出现在主线程里。

如果想继续深入,建议的学习路径是:先吃透SQLite的事务机制和WAL原理,再学习Python的threading和queue模块在GUI编程中的应用模式,最后可以拓展了解连接池、ORM框架(如SQLAlchemy)在中间件场景下的批量操作封装方式,这些都是Python开发从"能跑"到"好用"的必经之路。

觉得有用的话,欢迎微信打赏鼓励一下,让我有动力继续输出这类实战内容。完整源码结构已在各节逐一呈现,可结合项目实际直接落地;如需完整源码,可在公众号聊天窗口获取。

标签:#Python开发 #性能优化 #Tkinter #上位机 #中间件 #SQLite #编程技巧

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