每秒向MySQL表插入数据(每秒一次)

2024-05-04 03:23:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python,Raspberry Pi和MySQL的新手,希望你能帮助我。我正在尝试用Python编写一个脚本,它可以每秒向MySQL表中插入数据。我可以插入数据,但不是像我想要的那样是定期的,我已经试了很多次,但我找不到解决问题的方法。下面是我的Python代码和插入到MySQL表中的数据:

Python代码:

#!/usr/bin/env python

import MySQLdb
import time

while True:
    db = MySQLdb.connect("localhost", "mauro", "12345", "temps")
    curs=db.cursor()
    try:
        curs.execute ("""INSERT INTO thetemps 
                values(0, CURRENT_DATE(), NOW(), 28)""")
        db.commit()
        print "Data committed"
    except:
        print "Error"
        db.rollback()
    db.close()
    time.sleep(1)

表格结果:

^{pr2}$

正如您所看到的,有时纸条会周期性地插入数据,有时数据之间有8秒的间隔。所以,我的问题是:每次数据之间的间隔可能是1秒吗?我做错什么了? 对不起,英语不好,先谢谢你!在


Tags: 数据代码import脚本db间隔timemysql
3条回答

不要为此使用事务,可能在尝试插入新行时某些表被锁定。在

is possible to the interval between the data be 1 second every time?

理论上是的,但在实践中,有太多超出你控制范围的因素更有可能成为阻碍。其中包括但不限于:

  1. 操作系统内核的任务调度器
  2. 相对于其他任务的优先级
  3. 系统总负荷
  4. 表中已有的数据量(检查二叉树的时间复杂性)

这意味着,即使您的系统大部分时间处于空闲状态,time.sleep(1)也不能保证始终睡眠1秒,即使这样,系统也可能在做其他事情(例如,更多的I/O),并且每次执行相同操作需要不同的时间量。在

另外,不要每次在循环内都创建一个新的连接,您应该保持连接打开并节省开销。在

What am i doing wrong?

我不认为你在这里做了什么特别的错事。代码看起来不错,除了每次创建新连接的额外开销之外,不应该。除此之外,这里的问题归结为你无法控制的因素。在

也就是说,你可以做一些事情来提高你的机会。在


一些改进性能的附加建议

存储引擎

除了避免在每次迭代时打开/关闭数据库连接的开销外,还应该检查用于表的存储引擎。例如,根据您的MySQL版本,默认值可能仍然是MyISAM,这需要table锁才能写入。在

相比之下,InnoDB在写入表时只需要锁定,如果其他人正在使用该表,这应该会有所改善。如果发现没有使用InnoDB,请发出alter table ...查询来更改存储引擎。在

自动提交而不是事务

事务意味着将两个或多个查询的集合组合为一个单元,但您提交的是单个查询。相反,您应该将MySQL配置为启用自动提交,这样它就不必在提交和执行查询之后等待显式的commit请求,从而节省服务器和客户机之间的一些通信开销。在

通过增加优先级来影响操作系统调度程序

您可以为您的程序设置更高的优先级,以便调度程序在这里更有用。它也可能有助于对数据库服务/进程执行相同的操作。在

其他用户级别的任务也可以在必要时降低优先级。在

您将在每次迭代中建立到数据库服务器的新连接。这可能需要任意时间。将.connect()等移到循环之外可能会使计时更加一致:

db = MySQLdb.connect("localhost", "mauro", "12345", "temps")
curs = db.cursor()

while True:    
    try:
        curs.execute ("""INSERT INTO thetemps 
                values(0, CURRENT_DATE(), NOW(), 28)""")
        db.commit()
        print "Data committed"
    except:
        print "Error"
        db.rollback()    
    time.sleep(1)
db.close()

相关问题 更多 >