Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

कच्चे MySQLdb कर्सर के माध्यम से पंक्तियों की तुलना में ओआरएम 5-8x धीमी के माध्यम से SQLAlchemy ऑब्जेक्ट्स लोड क्यों कर रहा है?

यहां आपकी MySQL स्क्रिप्ट का SQLAlchemy संस्करण है जो MySQLdb के लिए तीन की तुलना में चार सेकंड में प्रदर्शन करता है:

from sqlalchemy import Integer, Column, create_engine, MetaData, Table
import datetime

metadata = MetaData()

foo = Table(
    'foo', metadata,
    Column('id', Integer, primary_key=True),
    Column('a', Integer(), nullable=False),
    Column('b', Integer(), nullable=False),
    Column('c', Integer(), nullable=False),
)


class Foo(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

engine = create_engine('mysql+mysqldb://scott:[email protected]/test', echo=True)
start = datetime.datetime.now()

with engine.connect() as conn:
    foos = [
        Foo(row['a'], row['b'], row['c'])
        for row in
        conn.execute(foo.select().limit(1000000)).fetchall()
    ]


print "total time: ", datetime.datetime.now() - start

रनटाइम:

total time:  0:00:04.706010

यहाँ एक स्क्रिप्ट है जो ऑब्जेक्ट पंक्तियों को पूरी तरह से लोड करने के लिए ORM का उपयोग करती है; प्रति उपज का उपयोग करते हुए सभी 1M वस्तुओं के साथ एक निश्चित सूची के निर्माण से बचने के द्वारा, यह 13 सेकंड में चलता है SQLAlchemy मास्टर के साथ (रिलीज़ 0.9 के साथ 18 सेकंड):

import time
from sqlalchemy import Integer, Column, create_engine, Table
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Foo(Base):
    __table__ = Table(
        'foo', Base.metadata,
        Column('id', Integer, primary_key=True),
        Column('a', Integer(), nullable=False),
        Column('b', Integer(), nullable=False),
        Column('c', Integer(), nullable=False),
    )


engine = create_engine('mysql+mysqldb://scott:[email protected]/test', echo=True)

sess = Session(engine)

now = time.time()

# avoid using all() so that we don't have the overhead of building
# a large list of full objects in memory
for obj in sess.query(Foo).yield_per(100).limit(1000000):
    pass

print("Total time: %d" % (time.time() - now))

फिर हम इन दो दृष्टिकोणों के बीच अंतर को विभाजित कर सकते हैं, और ओआरएम के साथ केवल अलग-अलग कॉलम लोड कर सकते हैं:

for obj in sess.query(Foo.id, Foo.a, Foo.b, Foo.c).yield_per(100).limit(1000000):
    pass

उपरोक्त फिर से 4 सेकंड में चलता है ।

SQLAlchemy Core की तुलना कच्चे MySQLdb कर्सर की तुलना में अधिक उपयुक्त है। यदि आप ORM का उपयोग करते हैं लेकिन अलग-अलग कॉलम के लिए क्वेरी करते हैं, तो यह सबसे हाल के संस्करणों में लगभग चार सेकंड है।

ओआरएम स्तर पर, गति के मुद्दे इसलिए हैं क्योंकि पायथन में ऑब्जेक्ट बनाना धीमा है, और SQLAlchemy ORM इन ऑब्जेक्ट्स को बड़ी मात्रा में बहीखाता पद्धति पर लागू करता है क्योंकि यह उन्हें प्राप्त करता है, जो यूनिट सहित इसके उपयोग अनुबंध को पूरा करने के लिए आवश्यक है। काम का, पहचान का नक्शा, उत्सुक लोडिंग, संग्रह, आदि।

क्वेरी को नाटकीय रूप से तेज़ करने के लिए, पूर्ण ऑब्जेक्ट के बजाय अलग-अलग कॉलम प्राप्त करें। यहां की तकनीकें देखेंhttp://docs .sqlalchemy.org/hi/latest/faq/performance.html#result-fetching-slowness-orm जो इसका वर्णन करते हैं।

PeeWee से आपकी तुलना के लिए, PW बहुत कम सुविधाओं के साथ एक बहुत ही सरल प्रणाली है, जिसमें यह भी शामिल है कि यह पहचान मानचित्रों के साथ कुछ भी नहीं करता है। PeeWee के साथ भी, ORM जितना आसान हो सके, इसमें अभी भी 15 सेकंड का समय लगता है। , जो इस बात का प्रमाण है कि cPython वास्तव में वास्तव में धीमा है कच्चे MySQLdb फ़ेच की तुलना में जो सीधे सी में है।

Java की तुलना में, Java VM cPython की तुलना में बहुत तेज़ है . हाइबरनेट हास्यास्पद है जटिल है, फिर भी जेआईटी के कारण जावा वीएम बेहद तेज है और यहां तक ​​कि सभी जटिलताएं भी तेजी से चलती हैं। यदि आप Python की तुलना Java से करना चाहते हैं, तो Pypy का उपयोग करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सुंदर परमालिंक और पोस्ट शीर्षक की निर्यात सूची

  2. एस्केपिंग कैरेक्टर जैसे $ और % | MySQL और PHP

  3. टेक्स्ट कॉलम को अद्वितीय कुंजी के रूप में बनाएं

  4. mysqli में ऑटो-इन्क्रीमेंट के रूप में आईडी के साथ डेटा डालने का उचित तरीका

  5. MySQL में रिकॉर्ड के अनुक्रमिक संग्रह को कैसे रिकॉर्ड करें