7.1 เหตุผลในการปรากฏตัวของดัชนี

สิ่งสำคัญอีกอย่างที่ไม่มีฐานข้อมูลคือดัชนี

ลองนึกภาพสถานการณ์ที่มีผู้ใช้ 10 ล้านคนใน ตาราง ผู้ใช้และคุณต้องการแสดงทุกคนที่มีระดับสูงกว่า 90 ข้อความค้นหานี้เขียนง่ายมาก:

SELECT * FROM user WHERE level > 90

เยี่ยมมาก เราเขียนคำขอในเวลาไม่ถึงนาที และจะใช้เวลานานแค่ไหนในการดำเนินการค้นหานี้จากเซิร์ฟเวอร์ SQL ในการดำเนินการค้นหา เขาจะต้องผ่าน 10 ล้านบันทึก และแม้ว่าจะมีเพียงบันทึกเดียว แต่ก็ต้องใช้เวลามาก

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

เยี่ยมมาก แต่ถ้าตอนนี้เราต้องการเลือกผู้ใช้ที่มีวันที่ลงทะเบียนก่อนปี 2020 จัดเรียงอีกครั้งตามวันที่ลงทะเบียนและใช้การค้นหาแบบไบนารี

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

แล้วจะเก็บข้อมูลเรียงพร้อมกันตามช่องต่างๆ ได้อย่างไร?

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

สมมติว่ามี 10 ผู้ใช้ที่มี id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

และคุณตัดสินใจที่จะจัดเรียงตามระดับ จากนั้นอาร์เรย์ของรหัสจะเป็นดังนี้{9, 2, 3, 1, 5, 4, 8, 6, 7, 10}:

และถ้าเราจัดเรียงตามวันที่ เราก็จะได้ เช่น{10, 1, 8, 7, 2, 3, 5, 9, 6}.

อาร์เรย์ของรหัสเหล่านี้เรียกว่าดัชนี องค์ประกอบมีขนาดใหญ่เราไม่ได้สัมผัสพวกเขา ใน Java เราไม่แตะต้องออบเจกต์ แต่เก็บการอ้างอิงไว้ ใน SQL เราไม่แตะต้องสตริงจริง แต่เก็บตัวเลขไว้

ให้ฉันเขียนสิ่งนี้ใหม่ในโค้ด Java:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

การจัดเรียงคอลเลกชันไม่ได้หมายถึงการย้ายองค์ประกอบจริง คอลเลกชันไม่ได้จัดเก็บวัตถุจริง แต่เชื่อมโยงไปยังวัตถุเหล่านั้น เช่นเดียวกับตาราง SQL เส้นจริงโกหกตัวเองและโกหก

และเมื่อเราต้องเลือกฟิลด์บางฟิลด์บ่อยๆ เราก็เพิ่มดัชนีอื่นลงในตาราง (คล้ายกับคอลเล็กชันใหม่ใน Java) และจัดเรียงแถวของตาราง เก็บลำดับที่จัดเรียงไว้ในไฟล์ดัชนีพิเศษ

ฉันหวังว่าการเปรียบเทียบ Java จะช่วยได้เล็กน้อย ฝึกฝนเล็กน้อย - และสำหรับคุณ การใช้ดัชนีก็จะกลายเป็นวิธีแก้ปัญหาที่ชัดเจนที่สุดเช่นกัน

7.2 การเพิ่มดัชนีลงในตาราง

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

การเพิ่มดัชนีลงในตารางนั้นง่ายมาก:

ALTER TABLE table
    ADD INDEX index_name (column);

หากคุณมักจะค้นหาเรกคอร์ดในหลายคอลัมน์พร้อมกัน คุณสามารถระบุดัชนีผสม: SQL ใช้หลายคอลัมน์ในการรวบรวม

การเพิ่มดัชนีผสมลงในตารางก็ง่ายมากเช่นกัน:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

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

ALTER TABLE table
    DROP INDEX index_name;

ดัชนีเองเป็นส่วนที่ค่อนข้างซ่อนอยู่ในฐานข้อมูล ไม่มีผลกับรูปแบบการเขียนแบบสอบถามแต่อย่างใด เป็นเพียงการมีอยู่ของพวกเขาเพิ่มความเร็วในการสุ่มตัวอย่างข้อมูลและทำให้การเพิ่มและการสำรองข้อมูลช้าลง

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