จะใช้ดัชนีในคำสั่งเลือกได้อย่างไร?


101

ให้พูดในตารางพนักงานฉันได้สร้างดัชนี (idx_name) บนemp_nameคอลัมน์ของตาราง

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

ถ้าจำเป็นต้องระบุไว้ในส่วนคำสั่ง select ไวยากรณ์สำหรับการใช้ดัชนีในแบบสอบถามแบบเลือกคืออะไร?

คำตอบ:


93

หากคุณต้องการทดสอบดัชนีเพื่อดูว่าใช้งานได้หรือไม่นี่คือไวยากรณ์:

SELECT *
FROM Table WITH(INDEX(Index_Name))

คำสั่ง WITH จะบังคับให้ใช้ดัชนี


83
กระทู้นี้ไม่ตอบคำถาม คำตอบคือโดยย่อ: คุณไม่จำเป็นต้องระบุดัชนีในแบบสอบถาม มันถูกใช้ (หรือไม่) โดยอัตโนมัติ คุณสามารถบังคับได้อย่างไรก็ตาม รายละเอียดเพิ่มเติม (เมื่อใดและทำไมถึงทำเช่นนี้) ในโพสต์อื่น ๆ ด้านล่าง
Rast

โพสต์นี้ตอบโจทย์ส่วนที่เกี่ยวข้องที่สุด "ไวยากรณ์สำหรับการใช้ดัชนีในคำค้นหาที่เลือกคืออะไร" ไม่ได้บอกอย่างชัดเจนว่า "เป็น" หรือ "ไม่จำเป็น" ในกรณีการใช้งานของฉันมีดัชนี แต่ไม่ได้ใช้ด้วยเหตุผลบางประการ การเพิ่มด้วย (INDEX (.. )) ถัดจากชื่อตารางช่วยแก้ปัญหาให้ฉันได้!
xorcus

34

คำถามที่ดี,

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

เพื่อให้สามารถตอบคำถามเฉพาะของคุณคุณต้องระบุฐานข้อมูลที่คุณใช้

สำหรับ MySQL คุณต้องการอ่านเอกสารIndex Hint Syntaxเกี่ยวกับวิธีการทำสิ่งนี้


30

จะใช้ดัชนีในคำสั่งที่เลือกได้อย่างไร?
ทางนี้:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

และวิธีอื่น ๆ อีกมากมายตรวจสอบสิ่งนี้

ฉันจำเป็นต้องระบุอย่างชัดเจนหรือไม่?

  • ไม่จำเป็นต้องระบุอย่างชัดเจน
  • เครื่องมือ DB ควรเลือกดัชนีที่จะใช้โดยอัตโนมัติตามแผนการดำเนินการสืบค้นที่สร้างจากคำตอบ @Tudor Constantin
  • เครื่องมือเพิ่มประสิทธิภาพจะตัดสินว่าการใช้ดัชนีของคุณจะทำให้การสืบค้นของคุณทำงานได้เร็วขึ้นหรือไม่และถ้าเป็นเช่นนั้นก็จะใช้ดัชนี จากคำตอบ @niktrl

13

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

หากแบบสอบถามของคุณอยู่ในรูปแบบ:

SELECT Name from Table where Name = 'Boris'

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

หากเป็นตารางกว้าง (คอลัมน์จำนวนมาก) และคุณทำ:

SELECT * from Table where Name = 'Boris'

จากนั้นมันอาจยังคงเลือกที่จะทำการสแกนตารางหากเป็นข้อสันนิษฐานที่สมเหตุสมผลว่าจะต้องใช้เวลาในการดึงคอลัมน์อื่น ๆ จากตารางมากกว่าที่จะค้นหาชื่อหรืออีกครั้งหากมีแนวโน้มที่จะดึงข้อมูล a แถวเยอะอยู่แล้ว


9

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

ขึ้นอยู่กับ RDBMS ของคุณคุณสามารถบังคับใช้ดัชนีได้แม้ว่าจะไม่แนะนำให้ใช้เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่

โดยทั่วไปคุณควรจัดทำดัชนีคอลัมน์ที่คุณใช้ในการเข้าร่วมตารางและคำสั่งที่


5

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

SELECT * FROM TABLE WHERE attribute = 'value'

จะใช้ดัชนีที่เหมาะสม.


5

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

อย่างไรก็ตามใน MSSQL คุณสามารถระบุindex hintซึ่งสามารถระบุว่าควรใช้ดัชนีเฉพาะเพื่อดำเนินการสืบค้นนี้ ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้สามารถพบได้ที่นี่

Index hintนอกจากนี้ยังดูเหมือนว่าจะสามารถใช้ได้สำหรับMySQL ขอบคุณ Tudor Constantine


1

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

อย่างไรก็ตามคุณสามารถบังคับให้เครื่องมือเพิ่มประสิทธิภาพสแกนโดยใช้สิ่งต่างๆเช่น

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

หรือค้นหาดัชนีเฉพาะโดยใช้สิ่งที่ต้องการ

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

ทางเลือกเป็นของคุณ ดูคุณสมบัติดัชนีของตารางในแผงออบเจ็กต์เพื่อดูว่าคุณต้องการใช้ดัชนีใด ควรตรงกับตัวกรองของคุณ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.