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")),
}
}
ด้วยคุณสมบัติของการประมาณดัชนี นักพัฒนาสามารถปรับแต่งดัชนีได้อย่างยืดหยุนเพื่อปรับปรุงประสิทธิภาพของฐานข้อมูลและโครงสร้างข้อมูล