ข้อ จำกัด UNIQUE สร้าง INDEX บนฟิลด์โดยอัตโนมัติหรือไม่


101

ฉันควรกำหนดดัชนีแยกต่างหากในemailคอลัมน์ (เพื่อจุดประสงค์ในการค้นหา) หรือดัชนีถูกเพิ่มโดยอัตโนมัติพร้อมกับUNIQ_EMAIL_USERข้อ จำกัด ?

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

แก้ไข : ตามคำแนะนำของ Corbin ฉันสอบถามEXPLAIN SELECT * FROM customer WHERE email = 'address'บนโต๊ะว่าง นี่คือผลลัพธ์ฉันไม่รู้ว่าจะตีความอย่างไร:

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

ในขณะที่เพิ่ม IXD_EMAIL ลงในตารางข้อความค้นหาเดียวกันจะแสดง:

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

1
ข้อ จำกัด UNIQUE ไม่จำเป็นต้องใช้ดัชนีในทางเทคนิค ... แต่ไม่แน่ใจว่ามาตรฐานกำหนดไว้อย่างไรหรือ MySQL (แบ็กเอนด์ใด btw?) นำมาใช้ สิ่งที่ฉันสามารถหาได้ใน MySQL ด้วยตนเองอย่างรวดเร็วคือ "ดัชนี UNIQUE สร้างข้อ จำกัด เพื่อให้ค่าทั้งหมดในดัชนีต้องแตกต่างกัน"

คุณต้องใช้และทดสอบด้วยดัชนีแต่ละตัวเทียบกับการครอบคลุม (คอมโพสิต AKA - มากกว่าหนึ่งคอลัมน์) ขึ้นอยู่กับการใช้งานและข้อมูล
OMG Ponies

3
ฉันแน่ใจ 99% ว่ามันสร้างดัชนี เพียงแค่สร้างตารางที่มีเอกลักษณ์จากนั้นอธิบายเกี่ยวกับการเลือกด้วยตำแหน่ง
Corbin

@Corbin ทำแล้วฉันจะแปลผลได้อย่างไร
gremo

มันใช้ข้อ จำกัด เฉพาะเป็นดัชนีหรือไม่? คุณอาจต้องใช้ตารางขนาดใหญ่มากข้างทางหรืออาจแค่สแกนตาราง
Corbin

คำตอบ:


117

สำคัญที่ไม่ซ้ำกันเป็นกรณีพิเศษของดัชนีทำตัวเหมือนดัชนีปกติกับการตรวจสอบเพิ่มสำหรับเอกลักษณ์ การใช้SHOW INDEXES FROM customerคุณจะเห็นว่าคีย์เฉพาะของคุณเป็นดัชนีประเภท B-tree

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

สำหรับการทดสอบการใช้ดัชนีคุณควรกรอกข้อมูลบางส่วนในตารางของคุณก่อนเพื่อให้เครื่องมือเพิ่มประสิทธิภาพคิดว่าคุ้มค่าที่จะใช้ดัชนีนั้น


ดังนั้นEXPLAINแสดงให้เห็นว่าการทดสอบ falsy ค่าเพราะของตารางที่ว่างเปล่า?
gremo

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

โอเคพบเคล็ดลับ เมื่อมีการกำหนดข้อ จำกัด โดยใช้user_idก่อนแล้วemailจะไม่ปรากฏในEXPLAIN. คุณตระหนักถึงเรื่องนี้หรือไม่?
gremo

12
ไม่ได้ผลเนื่องจากอีเมลไม่ใช่ส่วนซ้ายสุดของคู่ (user_id, email) คุณไม่สามารถลง b-tree เพื่อค้นหาแถวของคุณโดยใช้เฉพาะส่วนขวาสุด
piotrm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.