InnoDB หรือ MyISAM ไหนเร็วกว่ากัน


54

MyISAM จะ "เร็วขึ้น" ได้อย่างไรกว่า InnoDB ถ้า

  • MyISAM จำเป็นต้องอ่านข้อมูลในดิสก์หรือไม่
  • InnoDB ใช้บัฟเฟอร์พูลสำหรับดัชนีและข้อมูลและ MyISAM สำหรับดัชนีเท่านั้น

MyISAM อนุญาตให้บล็อกข้อมูลแคชของระบบปฏิบัติการดังนั้นจึงไม่ "อ่านดิสก์สำหรับข้อมูล" เสมอ
Rick James

คำตอบ:


68

วิธีเดียวที่ MyISAM สามารถทำได้เร็วกว่านั้น InnoDB จะอยู่ภายใต้สถานการณ์ที่ไม่เหมือนใคร

MyISAM

เมื่ออ่านแล้วดัชนีของตาราง MyISAM สามารถอ่านได้ครั้งเดียวจากไฟล์. MYI และโหลดใน MyISAM Key Cache (ปรับขนาดตามkey_buffer_size ) คุณจะทำให้. MyYAM ของตารางอ่านได้เร็วขึ้นได้อย่างไร ด้วยสิ่งนี้:

ALTER TABLE mytable ROW_FORMAT=Fixed;

ฉันเขียนเกี่ยวกับเรื่องนี้ในโพสต์ที่ผ่านมาของฉัน

InnoDB

ตกลงสิ่งที่เกี่ยวกับ InnoDB InnoDB ทำดิสก์ I / O ใด ๆ สำหรับการสืบค้นหรือไม่? น่าแปลกที่ใช่มันไม่ !! คุณอาจจะคิดผมบ้าบอกว่า แต่มันเป็นความจริงอย่างแน่นอนแม้สำหรับการค้นหา SELECT ณ จุดนี้คุณอาจสงสัยว่า "InnoDB เป็นอย่างไรในการทำดิสก์ I / O สำหรับการสืบค้น"

ทุกอย่างกลับไปที่ InnoDB ซึ่งเป็นเอ็นจิ้นการจัดเก็บข้อมูล Transactional ACID เพื่อให้ InnoDB เป็นธุรกรรมจะต้องมีการสนับสนุนIin ACIDซึ่งก็คือ Isolation เทคนิคสำหรับการรักษาความโดดเดี่ยวสำหรับธุรกรรมนั้นกระทำผ่านMVCC การควบคุมการเกิดพร้อมกันหลายอย่าง กล่าวอย่างง่าย InnoDB บันทึกข้อมูลที่มีลักษณะเหมือนก่อนที่ธุรกรรมจะพยายามเปลี่ยนแปลง ที่ได้รับการบันทึกไว้ที่ไหน ในไฟล์ tablespace ของระบบรู้จักกันในชื่อ ibdata1 ที่ต้องใช้ดิสก์ของ I / O

เปรียบเทียบ

เนื่องจากทั้ง InnoDB และ MyISAM ทำดิสก์ I / O ปัจจัยแบบสุ่มที่บอกว่าใครเร็วกว่ากัน

  • ขนาดของคอลัมน์
  • รูปแบบคอลัมน์
  • ชุดตัวละคร
  • ช่วงของค่าตัวเลข (ต้องการ INT ที่ใหญ่พอ)
  • แถวถูกแบ่งข้ามบล็อก (การโยงแถว)
  • การกระจายตัวของข้อมูลเกิดจากDELETEsและUPDATEs
  • ขนาดของคีย์หลัก (InnoDB มีดัชนีแบบคลัสเตอร์ต้องการการค้นหาคีย์สองครั้ง)
  • ขนาดของรายการดัชนี
  • รายการไปที่ ...

ดังนั้นในสภาพแวดล้อมที่อ่านหนักเป็นไปได้สำหรับตาราง MyISAM ที่มีรูปแบบแถวคงที่เพื่อให้มีประสิทธิภาพสูงกว่า InnoDB อ่านจาก InnoDB Buffer Pool หากมีข้อมูลเพียงพอที่จะถูกเขียนลงในบันทึกการเลิกทำที่มีอยู่ใน ibdata1 เพื่อสนับสนุนพฤติกรรมการทำธุรกรรม กำหนดไว้ในข้อมูล InnoDB

สรุปผลการศึกษา

วางแผนชนิดข้อมูลแบบสอบถามและเครื่องมือจัดเก็บข้อมูลของคุณอย่างรอบคอบ เมื่อข้อมูลเติบโตขึ้นอาจเป็นเรื่องยากมากที่จะย้ายข้อมูลไปมา แค่ถาม Facebook ...


1
คำตอบที่ยอดเยี่ยม Rolando ฉันต้องตั้งคำถามกับการอ้างสิทธิ์ที่ไม่น่าเชื่อของ Michael Stonebreaker ที่พยายามขายผลิตภัณฑ์ของเขาเองและไม่รู้อะไรเลยเกี่ยวกับ Facebook เมื่อฟัง Facebook แล้วเกี่ยวกับ MySQL หลายครั้งก็ชัดเจนว่าพวกเขาพอใจกับตัวเลือกของพวกเขา
Aaron Brown

@AaronBrown ฉันได้ฟัง Harrison Fisk เมื่อปีที่แล้วที่ Percona Live NYC และคุณพูดถูก - Facebook มีความสุขมากกับการใช้งาน InnoDB ที่พิเศษของพวกเขาและพวกเขาใช้เวลาอย่างไรกับวิธีการทำ schema เปลี่ยนแปลงระบบออนไลน์ เขายังให้โอกาสผู้ชมได้ทำงานกับ Facebook ในการจัดการข้อมูลขนาดใหญ่ ฉันรวมบทความเพื่อแสดงว่าบางคนกลัวเรื่องนั้น ฉันยินดีต้อนรับโอกาสที่จะทำงานกับข้อมูลขนาดใหญ่ มันจะสนุกและท้าทาย ลองนึกภาพเทคนิคต่าง ๆ ที่มีให้เรียนรู้ แน่นอนว่าฉันจะไม่แตะต้อง MyISAM ตลอดชีวิตของฉัน ...
RolandoMySQLDBA

ฉันอยู่ที่การประชุมนั้นด้วย (และโชคดีที่ได้พูดคุย) และการนำเสนอของ Harrison นั้นยอดเยี่ยมมาก
Aaron Brown

20

ในโลกที่เรียบง่าย MyISAM เร็วกว่าสำหรับการอ่าน InnoDB เร็วกว่าสำหรับการเขียน

เมื่อคุณเริ่มแนะนำการอ่าน / เขียนแบบผสม InnoDB จะเร็วขึ้นสำหรับการอ่านเช่นกันด้วยกลไกการล็อคแถว

ฉันเขียนเปรียบเทียบ เครื่องมือจัดเก็บข้อมูล MySQLเมื่อไม่กี่ปีที่ผ่านมาซึ่งยังคงเป็นจริงมาจนถึงทุกวันนี้โดยสรุปความแตกต่างที่เป็นเอกลักษณ์ระหว่าง MyISAM และ InnoDB

จากประสบการณ์ของฉันคุณควรใช้ InnoDB สำหรับทุกอย่างยกเว้น read-heavy cache-tables ที่ข้อมูลสูญหายเนื่องจากความเสียหายไม่สำคัญ


4
คำตอบนี้ล้าสมัยไปแล้ว 5 ปี InnoDB เป็นที่รู้จักในทุกด้าน ไม่มีข้อโต้แย้งอีกต่อไปสำหรับการใช้ MyISAM MySQL 8.0 อยู่ในขั้นตอนการลบ MyISAM ทั้งหมดเข้าด้วยกัน
Rick James

2
และตอนนี้ลิงก์นี้มีอายุ 9 ปีแล้ว
Rick James

การแก้ไขคำตอบคือ 9 ปีที่ล้าสมัย (ใครก็ตามที่อ่านประโยคแรกจะมีปัญหาร้ายแรงเมื่อทำฐานข้อมูล) และลิงก์มีอายุ 11 ปี ติดตาม Rick James คุณกำลังตกหลุมรัก :)
CYREX

1
คุณพูดถูกแล้ว @CYREX :-) โพสต์นี้มันยังคงได้รับปริมาณการใช้งานที่น่าอัศจรรย์ 11 ปีต่อมา มีการเปลี่ยนแปลงมากมายทั้งในชีวิตของฉันและในทางที่ InnoDB ได้รับการปรับให้เหมาะสม ทุกวันนี้ไม่ค่อยมีเหตุผลที่จะใช้ MyISAM
Mike Peters

ฉันต้องดูฐานข้อมูลที่กำลังจะตายในวันนี้และเอ็นจิ้นทั้งสองยังคงใช้กับ mysql รุ่นเก่า ตารางมีทั้ง InnoDB และ MyISAM และความอยากรู้ของฉันพาฉันไปที่โพสต์นี้ซึ่งมีประโยชน์มาก
Farrukh Subhani

14

เพื่อเพิ่มการตอบสนองที่นี่ซึ่งครอบคลุมความแตกต่างทางกลไกระหว่างเครื่องยนต์ทั้งสองฉันนำเสนอการศึกษาเปรียบเทียบความเร็วเชิงประจักษ์

ในแง่ของความเร็วบริสุทธิ์ไม่เสมอไปที่ MyISAM นั้นเร็วกว่า InnoDB แต่จากประสบการณ์ของฉันมันมักจะเร็วกว่าสำหรับสภาพแวดล้อมการทำงานของ PURE READ โดยประมาณ 2.0-2.5 เท่า เห็นได้ชัดว่านี่ไม่เหมาะสำหรับทุกสภาพแวดล้อม - ตามที่คนอื่นเขียน MyISAM ขาดสิ่งต่าง ๆ เช่นธุรกรรมและกุญแจต่างประเทศ

ฉันได้ทำการเปรียบเทียบเล็กน้อยด้านล่าง - ฉันใช้ python สำหรับการวนซ้ำและ timeit library สำหรับการเปรียบเทียบเวลา เพื่อความสนใจฉันยังได้รวมเอ็นจิ้นหน่วยความจำไว้ด้วยซึ่งจะให้ประสิทธิภาพที่ดีที่สุดทั่วทั้งกระดานแม้ว่ามันจะเหมาะสำหรับตารางที่เล็กกว่าThe table 'tbl' is fullเท่านั้น ตัวเลือกสี่ประเภทที่ฉันดูมีดังนี้:

  1. เลือกวานิลลา
  2. นับ
  3. SELECT ตามเงื่อนไข
  4. ตัวเลือกย่อยที่จัดทำดัชนีและไม่ได้จัดทำดัชนี

ประการแรกฉันสร้างสามตารางโดยใช้ SQL ต่อไปนี้

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

ด้วย 'MyISAM' แทน 'InnoDB' และ 'memory' ในตารางที่สองและสาม

 

1) เลือกวานิลลา

ค้นหา: SELECT * FROM tbl WHERE index_col = xx

ผล: วาด

การเปรียบเทียบวานิลลาเลือกโดยเอนจิ้นฐานข้อมูลที่แตกต่างกัน

ความเร็วของสิ่งเหล่านี้ล้วนกว้างเหมือนกันและตามที่คาดไว้จะเป็นเชิงเส้นในจำนวนคอลัมน์ที่จะเลือก InnoDB ดูเหมือนจะเร็วกว่า MyISAM เล็กน้อยแต่นี่ก็เป็นเพียงเล็กน้อยเท่านั้น

รหัส:

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

ผลลัพธ์: MyISAM ชนะ

การเปรียบเทียบจำนวนด้วยเอนจิ้นฐานข้อมูลที่แตกต่างกัน

อันนี้แสดงให้เห็นถึงความแตกต่างที่ยิ่งใหญ่ระหว่าง MyISAM และ InnoDB - MyISAM (และหน่วยความจำ) ติดตามจำนวนเร็กคอร์ดในตารางดังนั้นธุรกรรมนี้จึงรวดเร็วและ O (1) จำนวนเวลาที่ต้องใช้ในการนับ InnoDB จะเพิ่มขึ้นเป็นเส้นตรงด้วยขนาดของตารางในช่วงที่ฉันตรวจสอบ ฉันสงสัยว่าการเพิ่มความเร็วจากแบบสอบถาม MyISAM จำนวนมากที่พบในทางปฏิบัตินั้นเกิดจากผลกระทบที่คล้ายกัน

รหัส:

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

ผลลัพธ์: MyISAM ชนะ

การเปรียบเทียบเงื่อนไขที่เลือกโดยเอ็นจินฐานข้อมูลที่แตกต่างกัน

ที่นี่ MyISAM และหน่วยความจำมีประสิทธิภาพเท่ากันและเอาชนะ InnoDB ประมาณ 50% สำหรับตารางขนาดใหญ่ นี่คือการเรียงลำดับของแบบสอบถามที่ดูเหมือนว่าจะได้รับประโยชน์สูงสุดจาก MyISAM

รหัส:

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) การเลือกย่อย

ผลลัพธ์: InnoDB เป็นผู้ชนะ

สำหรับแบบสอบถามนี้ฉันสร้างชุดตารางเพิ่มเติมสำหรับตัวเลือกย่อย แต่ละคอลัมน์เป็นเพียงสองคอลัมน์ของ BIGINT โดยคอลัมน์หนึ่งมีดัชนีคีย์หลักและคอลัมน์หนึ่งไม่มีดัชนีใด ๆ เนื่องจากตารางขนาดใหญ่ฉันจึงไม่ได้ทดสอบเอนจิ้นหน่วยความจำ คำสั่งการสร้างตาราง SQL คือ

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

โดยที่ 'MyISAM' ถูกแทนที่ด้วย 'InnoDB' ในตารางที่สอง

ในแบบสอบถามนี้ฉันเว้นขนาดตารางการเลือกไว้ที่ 1000000 และจะเปลี่ยนขนาดของคอลัมน์ย่อยที่เลือกแทน

การเปรียบเทียบการเลือกย่อยโดยเอนจิ้นฐานข้อมูลที่แตกต่างกัน

ที่นี่ InnoDB เป็นผู้ชนะได้อย่างง่ายดาย หลังจากเราไปที่ตารางขนาดที่เหมาะสมทั้งสองเครื่องยนต์จะขยายขนาดเชิงเส้นด้วยขนาดของตัวเลือกย่อย ดัชนีจะเร่งความเร็วคำสั่ง MyISAM แต่น่าสนใจมีผลกระทบเล็กน้อยต่อความเร็ว 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 สำหรับคุณและยินดีต้อนรับสู่ DBA StackExchange !!!
RolandoMySQLDBA

1
นอกจากนี้โปรดดูโพสต์ของฉันdba.stackexchange.com/questions/1/…พร้อมกับคำตอบอื่น ๆ โพสต์ของคุณเป็นประเภทที่เหนือกว่า
RolandoMySQLDBA

SELECT * FROM tbl WHERE index_col = xx- ต่อไปนี้เป็นสองปัจจัยที่อาจนำไปสู่การเปลี่ยนแปลงเพิ่มเติมในกราฟ: คีย์หลัก vs คีย์รอง; ดัชนีถูกแคชเทียบกับไม่
Rick James

2
SELECT COUNT(*)เป็นผู้ชนะอย่างชัดเจนสำหรับ MyISAM จนกว่าคุณจะเพิ่มส่วนWHEREคำสั่ง
Rick James

ฉันคิดว่าประเด็นของฉันคือแต่ละแบบสอบถามจะต้องทำการเปรียบเทียบแยกต่างหาก ฉันได้รวมรหัสไว้ในคำตอบ - หากคุณต้องการทดลองใช้แบบสอบถามอื่นโปรดเป็นแขกของฉัน - หรือระบุอย่างชัดเจนว่าคุณต้องการแบบสอบถามอะไรและฉันจะเพิ่มเข้าไป
StackG

4

ไหนเร็วกว่ากัน อาจจะเร็วกว่าก็ได้ YMMV

คุณควรใช้แบบไหน InnoDB - crash-safe ฯลฯ ฯลฯ


ได้โปรดกำหนด "ฯลฯ ฯลฯ "
dellasavia

1
@dellasavia - "etc" ล่าสุดคือ Oracle กำลังวางแผนที่จะลบ MyISAM พวกเขามั่นใจใน InnoDB
Rick James
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.