sql >> Databáze >  >> RDS >> Mysql

Nejrychlejší způsob, jak číst obrovskou tabulku MySQL v pythonu

Další možností může být použití multiprocessing modul, rozdělí dotaz a odešle jej do více paralelních procesů a poté zřetězí výsledky.

Aniž bych toho moc věděl o pandas chunking – myslím, že byste to chunking museli dělat ručně (což závisí na datech)... Nepoužívejte LIMIT / OFFSET – výkon by byl hrozný.

V závislosti na datech to nemusí být dobrý nápad. Pokud existuje užitečný způsob, jak rozdělit dotaz (např. pokud je to časová řada nebo existuje nějaký vhodný indexový sloupec, který lze použít, může to mít smysl). Níže jsem uvedl dva příklady pro znázornění různých případů.

Příklad 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) 

Příklad 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)

Pravděpodobně hezčí způsoby, jak to udělat (a nebyly řádně testovány atd.). Zajímejte se, jak to jde, pokud to zkusíte.



  1. Pokus o migraci místního serveru mysql na AWS

  2. Změňte jedinečný klíč společně v mysql

  3. Aktualizujte tabulku mysql daty z jiné tabulky

  4. Pro parametry v připraveném výpisu nejsou dodány žádné údaje