Saat ini saya menggunakan MySQL Connector/Python untuk menanyakan database.

Saat ini, salah satu proses yang saya lakukan terlihat seperti ini:

SELECT some_column FROM some_table WHERE some_column_2 = foo_1;
SELECT some_column FROM some_table WHERE some_column_2 = foo_2;
SELECT some_column FROM some_table WHERE some_column_2 = foo_3;
...
SELECT some_column FROM some_table WHERE some_column_2 = foo_9999;
SELECT some_column FROM some_table WHERE some_column_2 = foo_10000;

Saya menjalankan sejumlah besar kueri yang sangat mirip.

Hasil individual dari setiap kueri adalah penting. Bahkan jika kueri yang diberikan tidak menghasilkan apa-apa sebagai hasilnya.

Sayangnya, pendekatan saat ini untuk membuat beberapa ribu kueri seperti itu memakan waktu dan sangat tidak efisien.

Jadi, pertanyaan saya adalah: apakah ada cara untuk menyingkat prosedur ini menjadi satu kueri, sehingga berjalan lebih efisien?

Saya merasa ini pasti mungkin di MySQL, dan saya cukup yakin ada sesuatu yang saya lewatkan di sini.


Sejauh ini, saya telah mencoba menggunakan fungsi MySQL Connector/Python's executemany(), seperti:

cursor.executemany("SELECT some_column FROM some_table WHERE some_column_2 = %s", foo_list)

Saya berharap ini menghasilkan daftar hasil untuk setiap kueri individual, tetapi dioptimalkan sebanyak kueri. Sayangnya, ini tampaknya tidak berfungsi di MySQL Connector/Python, dan menghasilkan kesalahan sintaksis.

Saya menduga bahwa executemany tidak dimaksudkan untuk digunakan dengan pernyataan SELECT, hanya dengan pernyataan INSERT.


Saya juga telah mencari di internet cara untuk melakukan kueri pemilihan massal, tetapi saya belum menemukan sesuatu yang relevan dengan situasi saya.

Saya ingin secara eksplisit menunjukkan bahwa

SELECT some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, foo_3, etc);

Adalah bukan solusi yang valid, karena tidak mempertahankan hasil (atau kekurangannya) dari setiap kueri individu.


Setiap bantuan dengan ini akan diterima.

0
trevorKirkby 11 Agustus 2017, 00:48

2 jawaban

Jawaban Terbaik

Daripada

PILIH some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, ..., foo_N);

Hanya meminta

SELECT some_column, some_column_2 FROM some_table WHERE some_column_2 IN (foo_1, foo_2, ..., foo_N);

Kode yang menghasilkan kueri mengetahui tentang nilai foo 1..N, dan akan melihat sebagian dari nilai tersebut kembali di hasil kolom 2.

Secara terpisah, penggunaan IN sering kali merupakan anti-pola, yang mengganggu kemampuan pengoptimal mysql untuk membuat rencana yang baik. Untuk klausa IN yang besar, Anda mungkin menemukan bahwa lebih baik Anda bersusah payah mengisi tabel FOO, dan bergabung melawannya.

1
J_H 10 Agustus 2017, 21:54

Saya telah menerima jawaban J H, karena memberikan informasi yang saya cari. Namun, saya juga akan memposting ini sebagai implementasi spesifik dari apa yang mereka sarankan:

cursor.execute("CREATE TABLE foo_table (foo VARCHAR(20))")
insert_query = "INSERT INTO foo_table (foo) VALUES (%s)"
cursor.executemany(insert_query, foo_list)
select_query = "SELECT some_table.some_column FROM some_table RIGHT JOIN foo_table on some_table.foo = foo_table.foo GROUP BY 1"
cursor.execute(select_query)

Ini tampaknya berfungsi sebagaimana dimaksud.

EDIT: Karena, untuk beberapa alasan, objek kursor di python MySQL Connector/Python hanya akan menghilangkan nilai "null", masih perlu memasangkan nilai "some_column" dan "foo". Karena, dalam kasus saya, setiap nilai "some_column" selalu benar-benar unik untuk setiap nilai "foo", saya dapat menggunakan ANY_VALUE() untuk melakukan ini.

0
trevorKirkby 11 Agustus 2017, 21:00