2011-05-13 4 views
7

ile son derece yavaştır. Aşağıdaki sorguyu hem phpMyAdmin & MySQLdb (python) içinde gerçekleştirdim.MySQLdb, büyük sonuç kümeleri

SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`) 
FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, 
FIND_IN_SET("metallica", `searchable_words`) as find_0 
FROM `model_song` HAVING find_0 

phpMyAdmin sorgu 2ms aldıklarını belirtti. Python kodum, MySQLdb kullanarak sorgunun 848ms'u aldığını (sonuçlar alınmadan) söyledi.

piton kodu: arayüzde büyük sonuç kümeleri döndüren kalmamak

self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat") 
self.cur = self.db.cursor() 

millis = lambda: time.time() * 1000 

start_time = millis() 
self.cur.execute_cmd("""SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`) 
FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, 
FIND_IN_SET("metallica", `searchable_words`) as find_0 
FROM `model_song` HAVING find_0""") 
print millis() - start_time 
+0

MySQL komut satırında bu sorguyu çalıştırırsanız, ne zaman alabilirim? – dusan

+0

Kaç kayıt döndürülüyor? _sure_ phpMyAdmin sorguyu siz mi kullanıyorsunuz? –

cevap

4

PHPMyAdmin tüm sorgulara bir sınır koyar. Bu nedenle, sorgunuz normalde 1.000.000 satır döndürürse ve PHPMyAdmin bunu 1.000'e (veya varsayılanı ne olursa olsun) düşürürse, Python tüm sonuç kümesini aldığında veya hatta sorguladığında çok daha uzun bir işlem süresi beklemeniz gerekir. Python'da, zamanları karşılaştırmak için PHPMyAdmin'deki sınırla eşleşen bir sınır yerleştirmeyi deneyin.

+0

Bunu çözdüm ama cevabını görmedim ... Ama ben seninkini kabul edeceğim: P –

13

Bir SQL sorgusunun büyük bir sonuç kümesine sahip olmasını beklerseniz, daha sonra kayıtla ilgili kayıt üzerinde yineleme yapmayı planlıyorsanız, varsayılan imleç yerine MySQLdb SSCursor kullanmayı düşünebilirsiniz. Varsayılan imleç, sonuç kümesinde saklanırken SSCursor, sonuç kümesini sunucuda saklar. Varsayılan imleçten farklı olarak, yapmanız gereken tek şey kayıtların tek tek üzerinde yinelenmesi durumunda SSCursor büyük bir başlangıç ​​gecikmesine neden olmaz.

how to use the SSCursor here'da örnek bir kod bulabilirsiniz.

Örneğin, deneyin:

import MySQLdb.cursors 

self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat", 
          cursorclass = MySQLdb.cursors.SSCursor) 

(. Kodun kalan aynı kalabilir)

+0

Bilgi için teşekkürler :) –

+3

Ya da DictCursor'ı kullanırsan, bunu SSDictCursor ile değiştir, böylece sonuçlar bir sözlük listesi olarak döndürülür. –