sql >> Databasteknik >  >> RDS >> Mysql

Snabbaste sättet att läsa enorma MySQL-tabeller i python

Ett annat alternativ kan vara att använda multiprocessing modul, delar upp frågan och skickar den till flera parallella processer och sammanfogar sedan resultaten.

Utan att veta mycket om pandas chunking - jag tror att du måste göra chunking manuellt (vilket beror på data)... Använd inte LIMIT / OFFSET - prestanda skulle vara fruktansvärt.

Detta kanske inte är en bra idé, beroende på data. Om det finns ett användbart sätt att dela upp frågan (t.ex. om det är en tidsserie, eller det finns någon form av lämplig indexkolumn att använda, kan det vara vettigt). Jag har lagt in två exempel nedan för att visa olika fall.

Exempel 1

import pandas as pd
import MySQLdb

def worker(y):
    #where y is value in an indexed column, e.g. a category
    connection = MySQLdb.connect(user='xxx', password='xxx', database='xxx', host='xxx')
    query = "SELECT * FROM example_table WHERE col_x = {0}".format(y)
    return pd.read_sql(query, connection)

p = multiprocessing.Pool(processes=10) 
#(or however many process you want to allocate)

data = p.map(worker, [y for y in col_x_categories])
#assuming there is a reasonable number of categories in an indexed col_x

p.close()
results = pd.concat(data) 

Exempel 2

import pandas as pd
import MySQLdb
import datetime

def worker(a,b):
    #where a and b are timestamps
    connection = MySQLdb.connect(user='xxx', password='xxx', database='xxx', host='xxx')
    query = "SELECT * FROM example_table WHERE x >= {0} AND x < {1}".format(a,b)
    return pd.read_sql(query, connection)

p = multiprocessing.Pool(processes=10) 
#(or however many process you want to allocate)

date_range = pd.date_range(start=d1, end=d2, freq="A-JAN")
# this arbitrary here, and will depend on your data /knowing your data before hand (ie. d1, d2 and an appropriate freq to use)

date_pairs = list(zip(date_range, date_range[1:]))
data = p.map(worker, date_pairs)

p.close()
results = pd.concat(data)

Förmodligen trevligare sätt att göra detta på (och inte har testat ordentligt etc). Var intresserad av att veta hur det går om du provar det.



  1. Hur man fyller i saknade datum i PostgreSQL med generation_series

  2. 1052:Kolumn 'id' i fältlistan är tvetydig

  3. Hur kör man två mysql-frågor som en i PHP/MYSQL?

  4. Få AVG att ignorera noll- eller nollvärden