Is there a way to use threads to simultaneously perform the SQL queries so I can cut down on fetching and processing time of my code below? Is there a better method to perform the same result faster? Given the size of the data sets, it's taking >22 seconds to get the result and likely to increase. Can I use multithread or improve this query to get results faster? Thanks in advance!
def fetch_14df(query1,query2,query3,query4,query5,query6,query7,query8,query9,query10,query11,query12,query13,query14):
mypkey = paramiko.RSAKey.from_private_key_file('xxxx.pem')
sql_main_database = "xxxx"
sql_username = "xxxx"
sql_password = "xxxx"
sql_hostname = "xxxx"
sql_port = xxxx
ssh_host = "xxxx.compute-1.amazonaws.com"
ssh_user = "viewUser"
ssh_port = 22
with SSHTunnelForwarder(
(ssh_host, ssh_port),
ssh_username=ssh_user,
ssh_pkey=mypkey,
remote_bind_address=(sql_hostname, sql_port)) as tunnel:
conn = pymysql.connect(host='127.0.0.1', user=sql_username,
passwd=sql_password, db=sql_main_database,
port=tunnel.local_bind_port)
#query = query
df1 = pd.read_sql_query(query1, conn)
df2 = pd.read_sql_query(query2, conn)
df3 = pd.read_sql_query(query3, conn)
df4 = pd.read_sql_query(query4, conn)
df5 = pd.read_sql_query(query5, conn)
df6 = pd.read_sql_query(query6, conn)
df7 = pd.read_sql_query(query7, conn)
df8 = pd.read_sql_query(query8, conn)
df9 = pd.read_sql_query(query9, conn)
df10 = pd.read_sql_query(query10, conn)
df11 = pd.read_sql_query(query11, conn)
df12 = pd.read_sql_query(query12, conn)
df13 = pd.read_sql_query(query13, conn)
df14 = pd.read_sql_query(query14, conn)
conn.close()
return df1, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12, df13, df14
Sample SQL Query:
select distinct partnerAssignedUserId, phone, date, source, planType,
left(date, 7) as 'month',
concat(left(date,5), if(week(date,3) < 10, concat('0', week(date,3)), week(date,3))) as 'week'
from
(
--
SELECT
DISTINCT
h.partnerAssignedUserId,
k.phone,
k.createTime as date,
'Web+Sub' as source,
'Annual' as planType
FROM
Membership k
inner join PartnerReferredUsers h on (k.phone = h.activatePhone)
LEFT JOIN Users u ON u.phone = k.phone
where k.STATUS = 1 and k.test = 0 and k.planType = 1
-- UNION
union
-- Manual Subs
SELECT
DISTINCT
h.partnerAssignedUserId,
u.phone,
if(sub.preLiveModeEndTime>NOW(), if(sub.preTrialStart is null,sub.preBillingCycleAnchor,sub.preTrialStart),if(sub.trialStart is null, sub.billingCycleAnchor,sub.trialStart)) as date,
'Manual Upgrade' as source,
if(p.`interval` = 'year', 'Annual', 'Monthly') as planType
FROM
Subscription sub
INNER JOIN Users u ON sub.customerId = u.stripeCustomerId
AND (
(planId IN (SELECT planId FROM Plan WHERE planType = 1) AND sub.subStatus = 1)
OR
(prePlanId IN (SELECT planId FROM Plan WHERE planType = 1) AND sub.subStatus = 1 AND preLiveModeEndTime>now())
)
AND NOT EXISTS ( SELECT phone FROM Membership k WHERE u.phone = k.phone and k.status=1)
inner join PartnerReferredUsers h on (u.phone = h.activatePhone)
inner join Plan p on p.planId = sub.planId
) raw
ORDER BY date desc;