1. แนวคิดและการประยุกต์ใช้ดัชนี

1.1 ดัชนีคืออะไร

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

1.2 ประเภทของดัชนี

มีหลายประเภทของดัชนี แต่ละประเภทมีการออกแบบและการปรับปรุงเพื่อการประยุกต์ใช้งานที่แตกต่างกัน:

  • ดัชนีสำหรับฟิลด์เดี่ยว: ดัชนีที่รวมเพียงหนึ่งฟิลด์ เหมาะสำหรับสถานการณ์ที่ใช้เงื่อนไขเดี่ยวสำหรับคิวรีอย่างรวดเร็ว
  • ดัชนีสมบูรณ์: ดัชนีที่รวมหลายฟิลด์ ทำให้การคิวรีที่มีการใช้เงื่อนไขดังกล่าวมีประสิทธิภาพ
  • ดัชนีที่ไม่ซ้ำกัน: รับรองความไม่ซ้ำกันของฟิลด์ที่มีดัชนี ยกเลิกค่าซ้ำได้ ดัชนีที่ไม่ซ้ำกันสามารถเป็นดัชนีสำหรับฟิลด์เดี่ยวหรือเป็นดัชนีสมบูรณ์ได้

2. ความหมายของดัชนี

2.1 ความหมายของดัชนีฟิลด์

การสร้างดัชนีสำหรับฟิลด์เดี่ยวเกี่ยวข้องกับการกำหนดดัชนีบนคอลัมน์ที่ระบุ สามารถทำได้โดยใช้เมธอด Fields ตัวอย่างต่อไปนี้แสดงตัวอย่างการสร้างดัชนีบนฟิลด์ phone ของตัวแทน User

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("phone"),
    }
}
func (User) Indexes() []ent.Index {
    // สร้างดัชนีสำหรับฟิลด์เดี่ยว
    return []ent.Index{
        index.Fields("phone"),
    }
}

ในตัวอย่างโค้ดนี้ ฟิลด์ phone ถูกสร้างดัชนี ซึ่งทำให้ระบบสามารถใช้ดัชนีสำหรับการค้นหาที่รวดเร็วเมื่อคิวรีฟิลด์ phone

2.2 ความหมายของดัชนีที่ไม่ซ้ำกัน

ดัชนีที่ไม่ซ้ำกันรับรองความไม่ซ้ำกันของข้อมูลในคอลัมน์ที่มีดัชนี สามารถสร้างได้โดยการเพิ่มเมธอด Unique ในฟิลด์ ตัวอย่างต่อไปนี้แสดงการสร้างดัชนีที่ไม่ซ้ำกันสำหรับฟิลด์เดี่ยวและหลายฟิลด์

การสร้างดัชนีที่ไม่ซ้ำกันสำหรับฟิลด์เดี่ยว:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("email").Unique(),
    }
}

ในตัวอย่างนี้ ฟิลด์ email ถูกกำหนดให้เป็นที่ไม่ซ้ำกัน เพื่อให้แน่ใจว่าอีเมลของผู้ใช้แต่ละคนถูกกำหนดเป็นที่ไม่ซ้ำกันในฐานข้อมูล

การสร้างดัชนีที่ไม่ซ้ำกันสำหรับการรวมหลายฟิลด์:

func (User) Indexes() []ent.Index {
    return []ent.Index{
        // สร้างดัชนีที่ไม่ซ้ำกันสำหรับหลายฟิลด์
        index.Fields("first_name", "last_name").Unique(),
    }
}

โค้ดนี้กำหนดดัชนีที่ไม่ซ้ำกันสำหรับการรวมของ first_name และ last_name ทำให้ไม่มีการบันทึกที่มีค่าเดียวกันทั้งคู่

2.3 ความหมายของดัชนีสมบูรณ์

เมื่อเงื่อนไขคิวรีเกี่ยวข้องกับหลายฟิลด์ ดัชนีสมบูรณ์มีบทบาทสำคัญ ดัชนีสมบูรณ์เก็บข้อมูลตามลำดับที่กำหนดในดัชนี ลำดับของดัชนีมีผลกระทบต่อประสิทธิภาพของคิวรี ดังนั้นเมื่อกำหนดดัชนีสมบูรณ์ ต้องกำหนดลำดับของฟิลด์ตามรูปแบบคิวรี

ตัวอย่างการสร้างดัชนีสมบูรณ์:

func (User) Indexes() []ent.Index {
    return []ent.Index{
        // สร้างดัชนีสมบูรณ์ด้วยหลายฟิลด์
        index.Fields("country", "city"),
    }
}

ในตัวอย่างนี้ มีการสร้างดัชนีสมบูรณ์บนฟิลด์ country และ city ซึ่งหมายความว่าเมื่อดำเนินการคิวรีที่เกี่ยวข้องกับฟิลด์เหล่านี้ ฐานข้อมูลสามารถสามารถค้นหาข้อมูลที่ตรงตามเงื่อนไขได้อย่างรวดเร็ว

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

3. ดัชนีขอบ

ในโครงสร้าง ent ดัชนีขอบเป็นวิธีที่ใช้ในการกำหนดดัชนีผ่านเส้นขอบ (ความสัมพันธ์) วิธีนี้มักถูกใช้เพื่อให้แน่ใจว่าฟิลด์ภายใต้ความสัมพันธ์ที่ระบุเป็นเฉพาะบุคคลในเชิงที่สมบูรณ์ เช่น ถ้าโมเดลฐานข้อมูลของคุณรวมถึงเมืองและถนน และชื่อถนนแต่ละอันในเมืองจำเป็นต้องเป็นค่าที่ไม่ซ้ำกัน ดัชนีขอบสามารถใช้เพื่อบรรลุวัตถุประสงค์นี้

// ไฟล์ ent/schema/street.go กำหนดโครงสร้างของตัวแทน Street
type Street struct {
    ent.Schema
}

func (Street) Fields() []ent.Field {
    // กำหนดฟิลด์
    return []ent.Field{
        field.String("name"),
    }
}

func (Street) Edges() []ent.Edge {
    // กำหนดความสัมพันธ์ขอบกับ City, ที่ Street เป็นส่วนของ City
    return []ent.Edge{
        edge.From("city", City.Type).
            Ref("streets").
            Unique(),
    }
}

func (Street) Indexes() []ent.Index {
    // สร้างดัชนีที่เป็นค่าที่ไม่ซ้ำกันผ่านเส้นขอบเพื่อให้แน่ใจว่าชื่อถนนภายในเมืองเดียวกันไม่ซ้ำกัน
    return []ent.Index{
        index.Fields("name").
            Edges("city").
            Unique(),
    }
}

ในตัวอย่างนี้ เราสร้างตัวแทน Street และเชื่อมโยงกับตัวแทน City โดยการกำหนดดัชนีขอบในเมธอด Indexes ของตัวแทน Street เราแน่ใจว่าชื่อของแต่ละถนนในเมืองถึงเป็นค่าที่ไม่ซ้ำกัน

บทที่ 5: ตัวเลือกดัชนีขั้นสูง

5.1 ดัชนีข้อความแบบเต็มและดัชนีแฮช

ดัชนีข้อความเต็มและดัชนียำแฮชเป็นสองประเภทของดัชนีที่เป็นเอกลักษณ์ใน MySQL และ PostgreSQL และมักถูกใช้สำหรับสถานการณ์การปรับปรุงการคิวรีที่แตกต่างกัน

ดัชนีข้อความเต็มและดัชนียำแฮชมักถูกใช้สำหรับการค้นหาข้อมูลข้อความโดยเฉพาะเมื่อคุณต้องการปฏิบัติการค้นหาที่ซับซ้อนเช่นการค้นหาการตรงคำ ทั้ง MySQL และ PostgreSQL รองรับการทำดัชนีข้อความเต็ม ตัวอย่างเช่น ใน MySQL คุณสามารถกำหนดดัชนีข้อความเต็มดังนี้:

// ไฟล์ ent/schema/user.go กำหนดโครงสร้างของตัวแทน User
func (User) Indexes() []ent.Index {
    // สร้างดัชนีข้อความเต็มโดยใช้ FULLTEXT ใน MySQL
    return []ent.Index{
        index.Fields("description").
            Annotations(entsql.IndexTypes(map[string]string{
                dialect.MySQL: "FULLTEXT",
            })),
    }
}

ดัชนียำแฮชเหมาะสำหรับคิวรีค่าเท่ากันและไม่รองรับการเรียงลำดับและการคิวรีช่วง ใน PostgreSQL คุณสามารถใช้ดัชนียำแฮชดังนี้:

func (User) Indexes() []ent.Index {
    // กำหนดดัชนีของประเภท HASH
    return []ent.Index{
        index.Fields("c4").
            Annotations(entsql.IndexType("HASH")),
    }
}

5.2 ดัชนีบางส่วนและคำนำดัชนี

ดัชนีบางส่วนเป็นประเภทของดัชนีที่เป็นดัชนีเฉพาะเพียงแถวที่อยู่ในตารางซึ่งตรงตามเงื่อนไขเฉพาะ ใน SQLite และ PostgreSQL คุณสามารถใช้คำสั่ง WHERE เพื่อสร้างดัชนีบางส่วน

ตัวอย่างการกำหนดดัชนีบางส่วนใน PostgreSQL:

func (User) Indexes() []ent.Index {
    // สร้างดัชนีบางส่วนบนฟิลด์ "nickname" ที่มีแถวเฉพาะเฉพาะที่ "active" เป็นจริง
    return []ent.Index{
        index.Fields("nickname").
            Annotations(
                entsql.IndexWhere("active"),
            ),
    }
}

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

func (User) Indexes() []ent.Index {
    // สร้างดัชนีโดยใช้คำนำดัชนี
    return []ent.Index{
        index.Fields("description").
            Annotations(entsql.Prefix(128)),
    }
}

5.3 การประมาณดัชนีและการปรับแต่ง

ใน ent Annotations เป็นคุณสมบัติที่อนุญาตให้นักพัฒนาปรับแต่งดัชนี คุณสามารถกำหนดประเภทดัชนี ตั้งกฎการเรียงลำดับ และอื่น ๆ

ตัวอย่างเช่น โค้ดต่อไปนี้สาธารณรับวิธีการระบุกฎการเรียงลำดับของคอลัมน์ในดัชนี:

func (User) Indexes() []ent.Index {
    return []ent.Index{
        // ใช้ Annotations เพื่อกำหนดกฎการเรียงลำดับคอลัมน์ของดัชนี
        index.Fields("c1", "c2", "c3").
            Annotations(entsql.DescColumns("c1", "c2")),
    }
}

ด้วยคุณสมบัติของการประมาณดัชนี นักพัฒนาสามารถปรับแต่งดัชนีได้อย่างยืดหยุนเพื่อปรับปรุงประสิทธิภาพของฐานข้อมูลและโครงสร้างข้อมูล