python : huge looping in SQL Table

标签 python mysql datetime

在 mySql 中,我有下表(名为“staff”),其中包含 800 条记录(可能更多):


     day          start_time              end_time     
   -----------------------------------------------------------------     
 2017-01-05 |   2017-01-05 08:00:00    2017-01-05 17:00:00  
 2017-01-06 |   2017-01-06 08:00:00    2017-01-06 17:00:00 
 2017-01-09 |   2017-01-09 08:00:00    2017-01-09 17:00:00 
  .....     |        ......

对于给定的日期时间,我的 python 函数在表 (col0) 中查找最近的一天并返回 col1 和 col2:

from datetime import datetime
import MySQLdb
import MySQLdb.cursors as cursors
import time

conn = MySQLdb.connect("localhost","root","","FOO_DATABASE", cursorclass = cursors.SSCursor )

def foo(x):
    c.execute("SELECT start_time, end_time FROM staff WHERE Date >= %s  ORDER BY Date  LIMIT 1", (x,))
    results = c.fetchone()
    col1 = results[0]
    col2 = results[1]
    return col1, col2


#Date_time to look
date_time = datetime.strptime('2017-01-01 12:22:00', "%Y-%m-%d %H:%M:%S")

#The loop
start = time.time()
for i in range(60000):
    c = conn.cursor()
    foo(date_time)
    c.close()

end = time.time()
print round((end - start), 2)

对于 60 000 次循环(这与我的程序无关)它在 21 秒内运行。

我期待着改进这一点。

编辑 1

好吧,刚刚在“day”列上创建了一个索引,速度快了 2 倍,9.13 秒。 希望改进它,因为它对我的应用程序来说还不够

编辑 2

为了更清楚地说明循环传递了 60,000 个不同的值,使用固定值是为了说明目的。

在我的生产调度算法中,我必须测试许多调度组合,从而找出给定日期时间的工作时间。如果日期不在我的表中(例如周末),该函数将返回下一个开放日工作时间范围。希望一切都清楚!

最佳答案

你应该尝试准备好的语句:

    from datetime import datetime
    import MySQLdb
    import MySQLdb.cursors as cursors
    import time

    conn = MySQLdb.connect("localhost","root","","FOO_DATABASE", cursorclass = cursors.SSCursor )
    #Date_time to look
    date_time = datetime.strptime('2017-01-01 12:22:00', "%Y-%m-%d %H:%M:%S")

    #The loop
    start = time.time()

    c = conn.cursor()
    for i in range(60000):
        c.execute("SELECT start_time, end_time FROM staff WHERE Date >= :p_date ORDER BY Date  LIMIT 1", {"p_date", date_time})
        col1, col2 = c.fetchone()
    c.close()

    end = time.time()
    print(round((end - start), 2))

或者甚至更好地尝试编写 sql,您将通过一次 sql 执行获得所有 60k 行。

关于 python : huge looping in SQL Table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945004/

相关文章:

python - 如何在 PyQt5 Qwidget 上显示 matplotlib

自己类型的python静态字段

mysql - sql内连接查看表

java - 在 Java 中将本地时间转换为 UTC

c# - Bootstrap 3 Datepicker 和 DateTime 验证错误

python - 模拟函数调用实际函数

php - MySQL 命令转换为 Yii create

mysql - 使用 UNION SELECT 删除重复结果

c# - LINQ 分组依据然后显示 (dd mmm) 的日期时间

python - 为什么我不能在 VS - Python 中导入turtle或turtle.Screen?