一些注意事项: - 我切换到了MySQLdb作为连接器,并且还使用了SSCursor。没有性能提升。 - 数据库已经过优化、索引等。我正在将此应用程序从运行良好的PHP/Codeigniter迁移到Python,但我愚蠢地认为离开PHP会加速它。 - PHP/Codeigniter可以迅速执行选择查询。例如,应用程序的一个关键方面在PHP/Codeigniter中需要约2秒,但在Python中,在执行任何数据分析之前就需要10秒。
我的数据库链接相当标准...
dbconn=MySQLdb.connect(host="127.0.0.1",user="*",passwd="*",db="*", cursorclass = MySQLdb.cursors.SSCursor)
希望能得到任何见解/帮助/建议!
更新
就获取/处理结果而言,我尝试了几种方法。最初的查询方式相当标准...
# Run Query
cursor.execute(query)
我删除了这个循环中的所有代码,以确保它不是瓶颈,并且它确实不是。我放置了虚拟代码。整个过程并没有加快速度。
db_results = "test"
# Loop Results
for row in cursor:
a = 0 (this was the dummy code I put in to test)
return db_results
查询结果本身只有501行(列数很多)......在Python之外只花了0.029秒。但在Python内部,需要更长时间。
这个项目与赛马有关。查询是在这个函数中完成的。查询本身很长,但在Python之外运行良好。我故意注释了循环内的代码进行测试......还有print(query),希望找出原因。
# Get PPs
def get_pps(race_ids):
# Comma Race List
race_list = ','.join(map(str, race_ids))
# PPs Query
query = ("SELECT raceindex.race_id, entries.entry_id, entries.prognum, runlines.line_id, runlines.track_code, runlines.race_date, runlines.race_number, runlines.horse_name, runlines.line_date, runlines.line_track, runlines.line_race, runlines.surface, runlines.distance, runlines.starters, runlines.race_grade, runlines.post_position, runlines.c1pos, runlines.c1posn, runlines.c1len, runlines.c2pos, runlines.c2posn, runlines.c2len, runlines.c3pos, runlines.c3posn, runlines.c3len, runlines.c4pos, runlines.c4posn, runlines.c4len, runlines.c5pos, runlines.c5posn, runlines.c5len, runlines.finpos, runlines.finposn, runlines.finlen, runlines.dq, runlines.dh, runlines.dqplace, runlines.beyer, runlines.weight, runlines.comment, runlines.long_comment, runlines.odds, runlines.odds_position, runlines.entries, runlines.track_variant, runlines.speed_rating, runlines.sealed_track, runlines.frac1, runlines.frac2, runlines.frac3, runlines.frac4, runlines.frac5, runlines.frac6, runlines.final_time, charts.raceshape "
"FROM hrdb_raceindex raceindex "
"INNER JOIN hrdb_runlines runlines ON runlines.race_date = raceindex.race_date AND runlines.track_code = raceindex.track_code AND runlines.race_number = raceindex.race_number "
"INNER JOIN hrdb_entries entries ON entries.race_date=runlines.race_date AND entries.track_code=runlines.track_code AND entries.race_number=runlines.race_number AND entries.horse_name=runlines.horse_name "
"LEFT JOIN hrdb_charts charts ON runlines.line_date = charts.race_date AND runlines.line_track = charts.track_code AND runlines.line_race = charts.race_number "
"WHERE raceindex.race_id IN (" + race_list + ") "
"ORDER BY runlines.line_date DESC;")
print(query)
# Run Query
cursor.execute(query)
# Query Fields
fields = [i[0] for i in cursor.description]
# PPs List
pps = []
# Loop Results
for row in cursor:
a = 0
#this_pp = {}
#for i, value in enumerate(row):
# this_pp[fields[i]] = value
#pps.append(this_pp)
return pps
最后说明一点...我还没有考虑处理结果的理想方式。我认为一个游标可以将结果返回为一组字典。由于查询和返回本身非常缓慢,我甚至还没有达到那个阶段。