之前在springboot+mybatis环境的坑和sql语句简化技巧的第2点提到,数据库的一对多查询可以一次查询多级数据,并且把拿到的数据按id聚合,使父级表和子级表都有数据。
但是这种查询,必然要查询大量的重复父数据,如果不用这种方法,而是分级查询,效果会如何?
要知道这2种数据的查询效率如何,用Python可以简单查询到总时长。
首先用pip install MySQL-python这条指令安装,至于出错解决方法就是https://www.cnblogs.com/superxuezhazha/p/6619036.html这篇文章的事了。
上代码:
import MySQLdb import json import uuid import random import traceback import time plan_id = 'assssss' use_times = 0 def noSubUuid(namespace=None): global use_times if namespace == None: use_times = use_times + 1 return str(uuid.uuid3(uuid.NAMESPACE_DNS,str(use_times))).replace('-','') else: return str(uuid.uuid3(uuid.NAMESPACE_DNS,namespace)).replace('-','') # Add Sample Data.生成示例数据 def addData(cursor, db): try: start = 18 user_ids = [] user_number_id = 490 for _ in range(600): user_id = noSubUuid() insertUserSql = 'insert into user VALUES (%d,\'%s\',\'%s\',\'YWRtaW4=\',\'%s\',2,0,1,NULL,NULL,NULL,\'2018-08-21 07:20:13\',NULL,NULL,NULL,\'my_ass_bdpf\',\'MXQ2NWRhNDNXNmM0OWQ1dG9rZW5fc2FsdA==\',\'2bbf024395e84adf80e2e72c6330ea57\')'%(user_number_id,user_id,noSubUuid()[20:],noSubUuid()) print(insertUserSql) cursor.execute(insertUserSql) user_ids.append(user_id) user_number_id = user_number_id+1 line_id = 490 man_num_id = 490 study_num_id = 590 limitNum = 450 for _ in range(400): start = 0 manage_id = noSubUuid() insertLineSql = 'insert into experiment_teaching_plan_resource_line values (%d,\'%s\',\'%s\',\'%s\')'%(line_id,noSubUuid(),plan_id,manage_id) print(insertLineSql) cursor.execute(insertLineSql) line_id = line_id + 1 insertManaSql = 'insert into resource_management values (%d,\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'20180109000000\',\'my_ass_bdpf\',4)'%(man_num_id,noSubUuid(),noSubUuid(),noSubUuid(),manage_id,noSubUuid(),noSubUuid()) print(insertManaSql) man_num_id = man_num_id + 1 cursor.execute(insertManaSql) for user_id in user_ids: if(start >= limitNum): return if(random.randint(0, 2) == 1): insertStudSql = 'insert into course_resource_study values (%d,\'%s\',\'%s\',\'%s\',null,null,null)'%(study_num_id,noSubUuid(),manage_id,noSubUuid()) print(insertStudSql) cursor.execute(insertStudSql) study_num_id = study_num_id + 1 start = start + 1 # db.commit() except Exception as e: print(traceback.format_exc()) db.rollback() # Rollback Sample Data.如果数据量过大对服务器造成影响,可以回滚示例数据 def rollbackData(cursor, db): try: cursor.execute('delete from course_resource_study where student_id in (select uid from user where user_col3 = \'my_ass_bdpf\')') cursor.execute('delete from user where user_col3 = \'my_ass_bdpf\'') cursor.execute('delete from experiment_teaching_plan_resource_line where resource_management_id in (select rm.resource_management_id COLLATE utf8_general_ci from resource_management rm where experimental_time = \'my_ass_bdpf\')') cursor.execute('delete from resource_management where experimental_time = \'my_ass_bdpf\'') db.commit() except Exception as e: print(traceback.format_exc()) db.rollback() # Query data like mybatis collection query.像Mybatis的collection查询一样查询数据 def SelectAtOnce(cursor, db): sql = 'select etp.*,rm.*,crs.* '\ + 'from experiment_teaching_plan etp '\ + 'JOIN experiment_teaching_plan_resource_line etpl ON etp.id=etpl.teaching_plan_id '\ + 'JOIN resource_management rm ON rm.resource_management_id=etpl.resource_management_id COLLATE utf8_general_ci '\ + 'JOIN course_resource_study crs ON rm.resource_management_id=crs.resource_management_id '\ + 'where etp.id=\'assssss\'' cnt = cursor.execute(sql) # Query data step by step.分级查询数据 def SelectByStep(cursor, db): cursor.execute('select * from experiment_teaching_plan where id=\'assssss\'') results = cursor.fetchall() plan_id = results[0][0] cursor.execute('select * from experiment_teaching_plan_resource_line where teaching_plan_id=\'%s\''%(plan_id,)) ids = ','.join(list(map(lambda a:"'" + a[3] + "'",cursor.fetchall()))) cursor.execute('select * from resource_management where resource_management_id in (%s)'%ids) ids = ','.join(list(map(lambda a:"'" + a[4] + "'",cursor.fetchall()))) cursor.execute('select * from course_resource_study where resource_management_id in (%s)'%ids) # if __name__ == '__main__': db = MySQLdb.connect("localhost", "root", "acmicpc", "my_ass_bdpf", charset='utf8') cursor = db.cursor() addData(cursor, db) #rollbackData(cursor, db) start = time.time() SelectAtOnce(cursor, db) mid = time.time() print(mid - start) SelectByStep(cursor, db) print(time.time() - mid) cursor.close() db.close() #