কোনটি দ্রুত, ইনোডিবি বা মাইআইএসএএম?


54

মাইআইএসএএম কীভাবে ইনোডিবি-র চেয়ে "দ্রুত" হতে পারে

  • মাইআইএসএএম-এর কি ডেটা পড়ার দরকার পড়ে?
  • ইনোডিবি সূচক এবং ডেটার জন্য বাফার পুল এবং মাইআইএসএএম কেবল সূচক জন্য ব্যবহার করে?

MyISAM ওএস ক্যাশে করতে দেয় ডেটা ব্লক, তাই এটি নেই না সর্বদা "ডিস্ক ডেটার জন্য সার্চ না"।
রিক জেমস

উত্তর:


68

একমাত্র মাইআইএসএএম দ্রুততর হতে পারে যে ইনোডিবি এই অনন্য পরিস্থিতিতে থাকবে

MyISAM

যখন পড়া হয়, কোনও মাইআইএসএএম টেবিলের সূচকগুলি .MYI ফাইল থেকে একবারে পড়তে পারে এবং মাইআইএসএএম কী ক্যাশে ( কী_বফার_ আকারের আকারের আকারে ) লোড করা যায় । আপনি কীভাবে মাইআইএসএএম টেবিল তৈরি করতে পারেন? এমআইডি দ্রুত পড়তে পারেন? এর সাথে:

ALTER TABLE mytable ROW_FORMAT=Fixed;

আমি আমার আগের পোস্টগুলিতে এ সম্পর্কে লিখেছিলাম

InnoDB

ঠিক আছে, ইনোডিবি সম্পর্কে কী? InnoDB কি অনুসন্ধানের জন্য কোনও ডিস্ক I / O করে? আশ্চর্যের বিষয় হ্যাঁ এটা করে !! আপনি সম্ভবত ভাবছেন যে আমি এটি বলার জন্য পাগল, তবে এটি একেবারে সত্য, এমনকি নির্বাচনী প্রশ্নের জন্যও । এই মুহুর্তে, আপনি সম্ভবত ভাবছেন "বিশ্বে ইনোডিবি কীভাবে অনুসন্ধানের জন্য ডিস্ক I / O করছে?"

এটি সবই এসিআইডি- অভিযোগ অভিযোগে ট্রানজেকশনাল স্টোরেজ ইঞ্জিন হয়ে ইনোডিবিতে ফিরে যায় । অর্ডার InnoDB লেনদেনগত হতে জন্য, এটা সমর্থন করার জন্য রয়েছে Iএর মধ্যে ACID, যা বিচ্ছিন্নতা নয়। লেনদেনের জন্য বিচ্ছিন্নতা বজায় রাখার কৌশলটি এমভিসিসি, মাল্টিভার্সিয়ন কনক্যুরঞ্জি নিয়ন্ত্রণের মাধ্যমে করা হয় । সহজ কথায়, লেনদেনগুলি পরিবর্তনের চেষ্টা করার আগে ইনোডিবি কী ডেটা দেখতে দেখতে রেকর্ড করে। কোথায় রেকর্ড করা যায়? সিস্টেম টেবিল স্পেস ফাইলে, আইবডাটা 1 হিসাবে বেশি পরিচিত। এর জন্য ডিস্ক I / O প্রয়োজন

তুলনা

যেহেতু ইনোডিবি এবং মাইআইএসএএম উভয়ই ডিস্ক আই / ও করে, তাই এলোমেলো কারণগুলি কোনটি দ্রুত নির্দেশ করে?

  • কলামের আকার
  • কলাম ফর্ম্যাট
  • চরিত্রের সেট
  • সংখ্যার মানগুলির ব্যাপ্তি (যথেষ্ট পরিমাণে বড় আইএনটি প্রয়োজন)
  • ব্লকগুলি জুড়ে বিভক্ত হওয়া সারিগুলি (সারি চেইন)
  • ডেটা ফ্র্যাগমেন্টেশন DELETEsএবং এর ফলে ঘটেUPDATEs
  • প্রাইমারি কী এর আকার (InnoDB এর একটি ক্লাস্টারড ইনডেক্স রয়েছে, যার জন্য দুটি মূল অনুসন্ধান প্রয়োজন)
  • সূচকের প্রবেশের আকার
  • তালিকাটি চলছে ...

সুতরাং, ভারী-পঠন পরিবেশে, মাইআইএসএএম টেবিলের জন্য একটি ফিক্সড রো ফর্ম্যাটটি সহকারে আইএনডিবি বাফার পুলের বাইরে থাকা ইনোডিবি-র পাঠানো সম্ভব হয় যদি লেনদেনের আচরণকে সমর্থন করার জন্য ইবদাটা 1-এ থাকা পূর্বাবস্থায় লগগুলিতে পর্যাপ্ত তথ্য লেখা থাকে is InnoDB ডেটা উপর চাপানো।

উপসংহার

আপনার ডেটা ধরণের, ক্যোয়ারী এবং স্টোরেজ ইঞ্জিনটি সতর্কতার সাথে পরিকল্পনা করুন। ডেটা বাড়ার পরে, ডেটাটি প্রায় সরানো খুব কঠিন হয়ে উঠতে পারে। শুধু ফেসবুকে জিজ্ঞাসা করুন ...


1
দুর্দান্ত উত্তর, রোল্যান্ডো। আপনার কাছে মাইকেল স্টোনব্রেকার দ্বারা করা অবিশ্বাস্য দাবির আপনার অন্তর্ভুক্তি সম্পর্কে আমি প্রশ্ন করতে চাই, যিনি কেবল নিজের পণ্য বিক্রি করার চেষ্টা করছেন এবং ফেসবুক সম্পর্কে কিছুই জানেন না। ফেসবুকটি মাইএসকিউএল সম্পর্কে বেশ কয়েকবার উপস্থিত থেকে শুনে, এটি স্পষ্ট যে তারা তাদের পছন্দগুলি নিয়ে আরামদায়ক।
অ্যারন ব্রাউন

অ্যারোনব্রাউন আমি পেরকোনা লাইভ এনওয়াইসি-তে গত বছর হ্যারিসন ফিস্কের কথা শুনেছি এবং আপনি ঠিক বলেছেন - অনলাইন স্কিমা পরিবর্তন ব্যবস্থার জন্য কীভাবে তারা ব্যয় করতে পারে এবং কীভাবে তারা সময় ব্যয় করে তা ফেসবুক খুব আনন্দিত। এমনকি তিনি দর্শকদের ফেসবুকের জন্য বড় ডেটা পরিচালনা করার জন্য কাজ করার সুযোগও দেন। আমি নিবন্ধটি অন্তর্ভুক্ত করে দেখিয়েছি যে কারও সম্পর্কে ভয় রয়েছে। আমি বিশাল তথ্য দিয়ে কাজ করার সুযোগ স্বাগত জানাব। এটি মজা এবং চ্যালেঞ্জিং হবে। সেখানকার কৌশলগুলি শিখার জন্য কল্পনা করুন। অবশ্যই, আমি আমার সারাজীবন মাইআইএসএএম-কে কখনও স্পর্শ করব না ...
রোল্যান্ডোমাইএসকিউএলডিবিএ

আমি সেই সম্মেলনেও ছিলাম (এবং বক্তৃতা দেওয়ার পক্ষে আমার সৌভাগ্য হয়েছিল) এবং হ্যারিসনের উপস্থাপনাটি দুর্দান্ত ছিল।
অ্যারন ব্রাউন

20

সরল বিশ্বে মাইআইএসএএম পাঠকদের পক্ষে দ্রুত, লেখার জন্য ইনোডিবি দ্রুত।

একবার আপনি মিশ্র পঠন / লেখাগুলি প্রবর্তন করা শুরু করলে, InnoDB তত দ্রুত পড়ার জন্য দ্রুত হবে, এর সারি লক করার ব্যবস্থাটির জন্য ধন্যবাদ।

আমি কয়েক বছর আগে মাইএসকিউএল স্টোরেজ ইঞ্জিনগুলির একটি তুলনা লিখেছিলাম , এটি এখনও মাইএসএএম এবং ইনোডিবি-র মধ্যে স্বতন্ত্র পার্থক্যটির রূপরেখা রেখে আজকের দিনে সত্য।

আমার অভিজ্ঞতায়, আপনার পড়া-ভারী ক্যাশে-টেবিলগুলি বাদ দিয়ে সমস্ত কিছুর জন্য InnoDB ব্যবহার করা উচিত, যেখানে দুর্নীতির কারণে ডেটা হারানো ততটা সমালোচনা নয়।


4
এই উত্তরটি 5 বছরের বাইরে 5 ইনোডিবি কার্যত সমস্তভাবে ধরা পড়েছে; মাইআইএসএএম ব্যবহারের জন্য আর কোন তর্ক নেই। মাইএসকিউএল 8.0 সমস্ত একসাথে মাইআইএসএএম সরানোর প্রক্রিয়াধীন রয়েছে ।
রিক জেমস

2
এবং লিঙ্কটি এখন 9 বছরের পুরানো।
রিক জেমস ২

সংশোধন করুন, উত্তরটি 9 বছরের পুরনো (প্রথম বাক্যে যে কেউ পড়তে হবে তাদের ডেটাবেস করার সময় কিছুটা গুরুতর সমস্যা হবে) এবং লিঙ্কটি 11 বছরের পুরানো। রিক জেমস ধরুন, আপনি পিছনে পড়ছেন :)।
CYREX

1
আপনি ঠিক @ ক্রেইরএক্স :-) এর চমকপ্রদ এই পোস্টটি 11 বছর পরে এখনও ট্র্যাফিক পাচ্ছে। আমার জীবনে এবং InnoDB যেভাবে অনুকূলিত হয়েছে তাতে উভয়ই অনেক কিছু বদলেছে। আজকাল, মাইসাম
মাইক পিটারস

আমাকে আজ কিছু ডাইটিং ডাটাবেসগুলি দেখতে হয়েছিল এবং উভয় ইঞ্জিনই এখনও মাইএসকিএল-এর পুরানো সংস্করণে ব্যবহার করছে। টেবিলগুলি ইনোডিবি এবং মাইআইএসএএম উভয়ই এবং আমার কৌতূহলটি আমাকে এই পোস্টে নিয়ে আসে যা খুব সহায়ক ছিল।
ফররুখ সুবহানী

14

দুটি ইঞ্জিনের মধ্যে যান্ত্রিক পার্থক্যগুলি কভার করে এখানে প্রতিক্রিয়াগুলিতে যুক্ত করতে আমি একটি অভিজ্ঞতাগত গতির তুলনা সমীক্ষা উপস্থাপন করি।

খাঁটি গতির ক্ষেত্রে, মাইআইএসএএম সর্বদা ইনোডিবি-র চেয়ে দ্রুত হয় না তবে আমার অভিজ্ঞতায় এটি প্রায় ২.০-২.৫ বারের ফ্যাক্টর দ্বারা খাঁটি রিড ওয়ার্কিং পরিবেশের জন্য দ্রুততর হয় faster স্পষ্টতই এটি সমস্ত পরিবেশের জন্য উপযুক্ত নয় - অন্যেরা যেমন লিখেছেন, মাইআইএসএএম-তে লেনদেন এবং বিদেশী কীগুলির মতো জিনিসগুলির অভাব রয়েছে।

আমি নীচে কিছুটা বেঞ্চমার্কিং করেছি - আমি লুপিংয়ের জন্য অজগর এবং সময় তুলনার জন্য সময়কালীন গ্রন্থাগার ব্যবহার করেছি। আগ্রহের জন্য আমি মেমরি ইঞ্জিনটিও অন্তর্ভুক্ত করেছি, এটি বোর্ড জুড়ে সেরা পারফরম্যান্স দেয় যদিও এটি কেবলমাত্র ছোট টেবিলের জন্য উপযুক্ত (আপনি The table 'tbl' is fullযখন মাইএসকিউএল মেমরির সীমা অতিক্রম করেন তখন আপনি ক্রমাগত মুখোমুখি হন )। আমি যে চার ধরণের নির্বাচনকে দেখেছি তা হ'ল:

  1. ভ্যানিলা নির্বাচন
  2. গন্য
  3. শর্তসাপেক্ষ নির্বাচন
  4. ইনডেক্সড এবং অ-সূচকযুক্ত উপ-নির্বাচন

প্রথমত, আমি নিম্নলিখিত এসকিউএল ব্যবহার করে তিনটি টেবিল তৈরি করেছি

CREATE TABLE
    data_interrogation.test_table_myisam
    (
        index_col BIGINT NOT NULL AUTO_INCREMENT,
        value1 DOUBLE,
        value2 DOUBLE,
        value3 DOUBLE,
        value4 DOUBLE,
        PRIMARY KEY (index_col)
    )
    ENGINE=MyISAM DEFAULT CHARSET=utf8

'মাইআইএসএএম' দিয়ে দ্বিতীয় এবং তৃতীয় টেবিলে 'ইনোডিবি' এবং 'মেমরির' বিকল্প রয়েছে।

 

1) ভ্যানিলা নির্বাচন

প্রশ্ন: SELECT * FROM tbl WHERE index_col = xx

ফলাফল: আঁকুন

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা ভ্যানিলা নির্বাচনের তুলনা

এর গতি সমস্ত বিস্তৃতভাবে একই এবং প্রত্যাশার হিসাবে নির্বাচিত কলামগুলির সংখ্যার মধ্যে লিনিয়ার। InnoDB মাইআইএসএএম এর চেয়ে কিছুটা দ্রুত বলে মনে হচ্ছে তবে এটি সত্যিই প্রান্তিক।

কোড:

import timeit
import MySQLdb
import MySQLdb.cursors
import random
from random import randint

db = MySQLdb.connect(host="...", user="...", passwd="...", db="...", cursorclass=MySQLdb.cursors.DictCursor)
cur = db.cursor()

lengthOfTable = 100000

# Fill up the tables with random data
for x in xrange(lengthOfTable):
    rand1 = random.random()
    rand2 = random.random()
    rand3 = random.random()
    rand4 = random.random()

    insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
    insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
    insertString3 = "INSERT INTO test_table_memory (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

    cur.execute(insertString)
    cur.execute(insertString2)
    cur.execute(insertString3)

db.commit()

# Define a function to pull a certain number of records from these tables
def selectRandomRecords(testTable,numberOfRecords):

    for x in xrange(numberOfRecords):
        rand1 = randint(0,lengthOfTable)

        selectString = "SELECT * FROM " + testTable + " WHERE index_col = " + str(rand1)
        cur.execute(selectString)

setupString = "from __main__ import selectRandomRecords"

# Test time taken using timeit
myisam_times = []
innodb_times = []
memory_times = []

for theLength in [3,10,30,100,300,1000,3000,10000]:

    innodb_times.append( timeit.timeit('selectRandomRecords("test_table_innodb",' + str(theLength) + ')', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('selectRandomRecords("test_table_myisam",' + str(theLength) + ')', number=100, setup=setupString) )
    memory_times.append( timeit.timeit('selectRandomRecords("test_table_memory",' + str(theLength) + ')', number=100, setup=setupString) )

 

2) গণনা

প্রশ্ন: SELECT count(*) FROM tbl

ফলাফল: মাইআইএসএএম জিতেছে

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা গণনা তুলনা

এটি মাইআইএসএএম এবং ইনোডিবি - মাইআইএসএএম (এবং মেমরি) এর মধ্যে একটি বড় পার্থক্য দেখায় যে এই সারণীতে রেকর্ডের সংখ্যার উপর নজর রাখে, সুতরাং এই লেনদেন দ্রুত এবং ও (1)। InnoDB গণনা করতে যে পরিমাণ সময় প্রয়োজন তা তদন্তের পরিসীমাতে সারণীর আকারের সাথে দুর্দান্ত-রৈখিকভাবে বৃদ্ধি পায়। আমার সন্দেহ হয় যে মাইআইএসএএম ক্যোয়ারীগুলি থেকে অনেকগুলি গতি-আপগুলি যা অনুশীলনে দেখা হয় এটি একই রকম প্রভাবের কারণে।

কোড:

myisam_times = []
innodb_times = []
memory_times = []

# Define a function to count the records
def countRecords(testTable):

    selectString = "SELECT count(*) FROM " + testTable
    cur.execute(selectString)

setupString = "from __main__ import countRecords"

# Truncate the tables and re-fill with a set amount of data
for theLength in [3,10,30,100,300,1000,3000,10000,30000,100000]:

    truncateString = "TRUNCATE test_table_innodb"
    truncateString2 = "TRUNCATE test_table_myisam"
    truncateString3 = "TRUNCATE test_table_memory"

    cur.execute(truncateString)
    cur.execute(truncateString2)
    cur.execute(truncateString3)

    for x in xrange(theLength):
        rand1 = random.random()
        rand2 = random.random()
        rand3 = random.random()
        rand4 = random.random()

        insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString3 = "INSERT INTO test_table_memory (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

        cur.execute(insertString)
        cur.execute(insertString2)
        cur.execute(insertString3)

    db.commit()

    # Count and time the query
    innodb_times.append( timeit.timeit('countRecords("test_table_innodb")', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('countRecords("test_table_myisam")', number=100, setup=setupString) )
    memory_times.append( timeit.timeit('countRecords("test_table_memory")', number=100, setup=setupString) )

 

3) শর্তসাপেক্ষ নির্বাচন

প্রশ্ন: SELECT * FROM tbl WHERE value1<0.5 AND value2<0.5 AND value3<0.5 AND value4<0.5

ফলাফল: মাইআইএসএএম জিতেছে

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা শর্তাধীন নির্বাচনের তুলনা

এখানে, মাইআইএসএএম এবং মেমরি প্রায় একই কাজ করে এবং বড় টেবিলের জন্য ইনোডিবিকে প্রায় 50% দ্বারা পরাজিত করে। এটি এমনই ক্যোয়ারির ধরণের জন্য যার জন্য মাইআইএসএএমের সুবিধাগুলি সর্বাধিক করা হয়েছে।

কোড:

myisam_times = []
innodb_times = []
memory_times = []

# Define a function to perform conditional selects
def conditionalSelect(testTable):
    selectString = "SELECT * FROM " + testTable + " WHERE value1 < 0.5 AND value2 < 0.5 AND value3 < 0.5 AND value4 < 0.5"
    cur.execute(selectString)

setupString = "from __main__ import conditionalSelect"

# Truncate the tables and re-fill with a set amount of data
for theLength in [3,10,30,100,300,1000,3000,10000,30000,100000]:

    truncateString = "TRUNCATE test_table_innodb"
    truncateString2 = "TRUNCATE test_table_myisam"
    truncateString3 = "TRUNCATE test_table_memory"

    cur.execute(truncateString)
    cur.execute(truncateString2)
    cur.execute(truncateString3)

    for x in xrange(theLength):
        rand1 = random.random()
        rand2 = random.random()
        rand3 = random.random()
        rand4 = random.random()

        insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString3 = "INSERT INTO test_table_memory (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

        cur.execute(insertString)
        cur.execute(insertString2)
        cur.execute(insertString3)

    db.commit()

    # Count and time the query
    innodb_times.append( timeit.timeit('conditionalSelect("test_table_innodb")', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('conditionalSelect("test_table_myisam")', number=100, setup=setupString) )
    memory_times.append( timeit.timeit('conditionalSelect("test_table_memory")', number=100, setup=setupString) )

 

4) উপ-নির্বাচন

ফলাফল: ইনোডিবি জিতেছে

এই ক্যোয়ারির জন্য, আমি সাব-সিলেক্টের জন্য টেবিলগুলির একটি অতিরিক্ত সেট তৈরি করেছি। প্রতিটি হ'ল বিজিআইএনটিসের কেবল দুটি কলাম, একটি প্রাথমিক কী সূচক সহ একটি এবং কোনও সূচি ছাড়াই। বড় টেবিল আকারের কারণে, আমি মেমরি ইঞ্জিনটি পরীক্ষা করিনি। এসকিউএল টেবিল তৈরি কমান্ড ছিল

CREATE TABLE
    subselect_myisam
    (
        index_col bigint NOT NULL,
        non_index_col bigint,
        PRIMARY KEY (index_col)
    )
    ENGINE=MyISAM DEFAULT CHARSET=utf8;

যেখানে আবার 'মাইআইএসএএম' দ্বিতীয় টেবিলে 'ইনোডিবি'র পরিবর্তিত হবে।

এই ক্যোয়ারিতে আমি নির্বাচন টেবিলের আকার 1000000 এ রেখেছি এবং পরিবর্তে উপ-নির্বাচিত কলামগুলির আকারের পরিবর্তিত।

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা উপ-নির্বাচনের তুলনা

এখানে InnoDB সহজেই জয়ী হয়। আমরা কোনও যুক্তিসঙ্গত আকারের টেবিলটিতে পৌঁছানোর পরে উপ-নির্বাচনের আকারের সাথে উভয় ইঞ্জিনই স্কোরকে লাইন করে স্কেল করি। সূচকটি মাইআইএসএএম কমান্ডকে গতি দেয় তবে আকর্ষণীয়ভাবে ইনোডিবি গতিতে খুব কম প্রভাব ফেলে। subSelect.png

কোড:

myisam_times = []
innodb_times = []
myisam_times_2 = []
innodb_times_2 = []

def subSelectRecordsIndexed(testTable,testSubSelect):
    selectString = "SELECT * FROM " + testTable + " WHERE index_col in ( SELECT index_col FROM " + testSubSelect + " )"
    cur.execute(selectString)

setupString = "from __main__ import subSelectRecordsIndexed"

def subSelectRecordsNotIndexed(testTable,testSubSelect):
    selectString = "SELECT * FROM " + testTable + " WHERE index_col in ( SELECT non_index_col FROM " + testSubSelect + " )"
    cur.execute(selectString)

setupString2 = "from __main__ import subSelectRecordsNotIndexed"

# Truncate the old tables, and re-fill with 1000000 records
truncateString = "TRUNCATE test_table_innodb"
truncateString2 = "TRUNCATE test_table_myisam"

cur.execute(truncateString)
cur.execute(truncateString2)

lengthOfTable = 1000000

# Fill up the tables with random data
for x in xrange(lengthOfTable):
    rand1 = random.random()
    rand2 = random.random()
    rand3 = random.random()
    rand4 = random.random()

    insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
    insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

    cur.execute(insertString)
    cur.execute(insertString2)

for theLength in [3,10,30,100,300,1000,3000,10000,30000,100000]:

    truncateString = "TRUNCATE subselect_innodb"
    truncateString2 = "TRUNCATE subselect_myisam"

    cur.execute(truncateString)
    cur.execute(truncateString2)

    # For each length, empty the table and re-fill it with random data
    rand_sample = sorted(random.sample(xrange(lengthOfTable), theLength))
    rand_sample_2 = random.sample(xrange(lengthOfTable), theLength)

    for (the_value_1,the_value_2) in zip(rand_sample,rand_sample_2):
        insertString = "INSERT INTO subselect_innodb (index_col,non_index_col) VALUES (" + str(the_value_1) + "," + str(the_value_2) + ")"
        insertString2 = "INSERT INTO subselect_myisam (index_col,non_index_col) VALUES (" + str(the_value_1) + "," + str(the_value_2) + ")"

        cur.execute(insertString)
        cur.execute(insertString2)

    db.commit()

    # Finally, time the queries
    innodb_times.append( timeit.timeit('subSelectRecordsIndexed("test_table_innodb","subselect_innodb")', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('subSelectRecordsIndexed("test_table_myisam","subselect_myisam")', number=100, setup=setupString) )

    innodb_times_2.append( timeit.timeit('subSelectRecordsNotIndexed("test_table_innodb","subselect_innodb")', number=100, setup=setupString2) )
    myisam_times_2.append( timeit.timeit('subSelectRecordsNotIndexed("test_table_myisam","subselect_myisam")', number=100, setup=setupString2) )

আমি মনে করি এই সমস্ত কিছুর গ্রহণের বার্তাটি হ'ল আপনি যদি গতি সম্পর্কে সত্যই উদ্বিগ্ন হন তবে কোন ইঞ্জিনটি আরও উপযুক্ত হবে সে সম্পর্কে কোনও অনুমানের চেয়ে আপনি যে প্রশ্নগুলি করছেন তা বেঞ্চমার্ক করা দরকার।


1
আমি আপনার উত্তরটি পছন্দ করি কারণ এটি যে যার পক্ষে আপনি বেঞ্চমার্ক করে সিদ্ধান্ত নেন। কোনও দুটি সিস্টেমই বিভিন্ন স্টোরেজ ইঞ্জিন থেকে একই উপকারে আসে না এবং স্টোরেজ ইঞ্জিনটি বেছে নেওয়ার জন্য যথাযথ অধ্যবসায় প্রয়োজন। আপনার জন্য +1 এবং ডিবিএ স্ট্যাক এক্সচেঞ্জে স্বাগতম!
RolandoMySQLDBA

1
এছাড়াও, অন্যান্য উত্তরগুলির সাথে আমার পোস্টটি ডিবিএ.স্ট্যাকেক্সেঞ্জার / প্রশ্ন / //২ দেখুন । আপনার পোস্ট ধরণের উপরে এবং অতিক্রম করে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

SELECT * FROM tbl WHERE index_col = xx- এখানে দুটি কারণ যা গ্রাফটিতে আরও বেশি বৈচিত্রের দিকে নিয়ে যাওয়ার সম্ভাবনা রয়েছে: প্রাথমিক কী বনাম গৌণ কী; সূচী বনাম না ক্যাশে হয়।
রিক জেমস

2
SELECT COUNT(*)আপনি কোনও WHEREধারা যোগ না করা পর্যন্ত মাইআইএসএএম এর পক্ষে স্পষ্ট বিজয়ী ।
রিক জেমস

আমি মনে করি যে আমার বক্তব্যটি হ'ল প্রতিটি প্রশ্নের পৃথক পৃথক বেঞ্চমার্ক করা দরকার। আমি উত্তরে কোডটি অন্তর্ভুক্ত করেছি - আপনি যদি অন্য কোনও ক্যোয়ারির পরীক্ষা করতে চান তবে দয়া করে আমার অতিথি হন - অথবা আপনি কী জিজ্ঞাসা চান তা স্পষ্ট হয়ে উঠুন এবং আমি এটি যুক্ত করব।
স্ট্যাকজি

4

কোনটি দ্রুত? হয় দ্রুত হতে পারে। YMMV।

আপনার কোনটি ব্যবহার করা উচিত? InnoDB - ক্রাশ-নিরাপদ, ইত্যাদি


দয়া করে "ইত্যাদি ইত্যাদি সংজ্ঞা দিন"
ডেলালাভিয়া

1
@ ডেলাসাভিয়া - অতি সাম্প্রতিক "ইত্যাদি" হ'ল ওরাকল মাইআইএসএএম অপসারণের পরিকল্পনা করছেন। তারা ইনোডিবিতে সেই আত্মবিশ্বাসী।
রিক জেমস ২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.