Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara tercepat untuk membaca tabel MySQL besar dengan python

Pilihan lain mungkin menggunakan multiprocessing modul, membagi kueri dan mengirimkannya ke beberapa proses paralel, lalu menggabungkan hasilnya.

Tanpa mengetahui banyak tentang pandas chunking - Saya pikir Anda harus melakukan chunking secara manual (yang tergantung pada data)... Jangan gunakan LIMIT / OFFSET - kinerja akan buruk.

Ini mungkin bukan ide yang baik, tergantung pada datanya. Jika ada cara yang berguna untuk membagi kueri (misalnya jika itu adalah rangkaian waktu, atau ada semacam kolom indeks yang sesuai untuk digunakan, mungkin masuk akal). Saya telah memasukkan dua contoh di bawah ini untuk menunjukkan kasus yang berbeda.

Contoh 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) 

Contoh 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)

Mungkin cara yang lebih baik melakukan ini (dan belum diuji dengan benar, dll). Tertarik untuk mengetahui bagaimana kelanjutannya jika Anda mencobanya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sepertinya tidak bisa EDIT/MODIFY tabel php saya dengan id

  2. Bisakah angka digunakan untuk memberi nama kolom tabel MySQL?

  3. Jika kita mengubah nilai kunci utama, mengapa kita tidak mengubah nilai kolom dependen?

  4. Cara mendapatkan beberapa kolom dari satu kolom, SQL

  5. ERROR 1366 (HY000):Nilai integer salah:'' untuk kolom 'id' di baris 1