ดัชนีหลายคอลัมน์หรือหลายดัชนีสำหรับตาราง MySQL อนุกรมเวลา?

ฉันมีตาราง MySQL MyISAM ที่มีข้อมูลราคาประมาณ 400 ล้านแถว (ข้อมูล 7GB + ดัชนี 9GB) โดยมี 3 คอลัมน์:

CREATE TABLE `prices` (
  `ts` datetime NOT NULL,
  `id` int(10) unsigned NOT NULL,
  `price` double NOT NULL,
  PRIMARY KEY (`ts`,`instrid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1$$

จำนวน ids ที่แตกต่างกัน (ฉันคิดว่าคาร์ดินัลลิตีคือคำ) คือ ~500 และสำหรับช่วงเวลาที่น่าสนใจส่วนใหญ่ ภายในช่วงเวลาเหล่านั้น จำนวนคาร์ดินัลลิตี้ของ id จะต่ำกว่า ~20 (ดังนั้นจึงมี ID ที่แตกต่างกันเพียง 20 รหัสเท่านั้นระหว่างเดือนมีนาคม ที่ 1 และ 2)

ข้อความค้นหาอยู่ในรูปแบบเกือบทั้งหมด:

select ts, price from prices where ts between {t1} and {t2} and id = {id}.

ดูเหมือนว่าดัชนีบางตัวควรเร่งความเร็วให้เร็วขึ้น

ดัชนีรวมใน ts และ id หรือดัชนีแยกกันใน ts และ id จะดีกว่าหรือไม่ ทางเลือกที่ 3 บ้างไหม? ฉันขอขอบคุณคำแนะนำว่าฉันสามารถเรียนรู้วิธีตอบคำถามนี้ด้วยตัวเองได้จากที่ไหน

ตารางประเภทอื่น (InnoDB?) จะเหมาะสมกับวัตถุประสงค์ของฉันมากกว่าหรือไม่


person John Salvatier    schedule 24.02.2012    source แหล่งที่มา


คำตอบ (1)


ฉันจะไปหาดัชนีรวมเดียวใน ts ราคาและ id - โดยปกติแล้ว MySQL จะดำเนินการสองอย่าง อันดับแรกจะค้นหาแถวโดยใช้ดัชนี จากนั้นจะดึงแถวจากฐานข้อมูล อย่างไรก็ตาม หากคุณมีข้อมูลทั้งหมดในดัชนี มันก็จะดึงข้อมูลโดยตรงจากดัชนีโดยไม่ต้องดึงแถวจากฐานข้อมูล เรียกว่า "ดัชนีครอบคลุม"

ในการเลือกฐานข้อมูล คนส่วนใหญ่ดูเหมือนจะแนะนำ InnoDB สำหรับการใช้งานอย่างจริงจัง มีการเปรียบเทียบที่ดี ที่นี่

person user1228295    schedule 24.02.2012
comment
ตกลง สร้างดัชนีครอบคลุมด้วยคอลัมน์ตามลำดับต่อไปนี้ (ts, id, price) - person Marcus Adams; 25.02.2012
comment
ทางออกที่น่าสนใจ ฉันจะลองดูและดูบทความนั้น ขอบคุณ :) - person John Salvatier; 25.02.2012
comment
คุณรู้หรือไม่ว่าจะเกิดปัญหาหากดัชนีนี้ไม่พอดีกับหน่วยความจำ? - person John Salvatier; 26.02.2012