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;
ดัชนีเองเป็นส่วนที่ค่อนข้างซ่อนอยู่ในฐานข้อมูล ไม่มีผลกับรูปแบบการเขียนแบบสอบถามแต่อย่างใด เป็นเพียงการมีอยู่ของพวกเขาเพิ่มความเร็วในการสุ่มตัวอย่างข้อมูลและทำให้การเพิ่มและการสำรองข้อมูลช้าลง
แต่เมื่อพิจารณาว่าความเร็วมีความสำคัญเพียงใดในโลกปัจจุบันและพื้นที่ดิสก์ราคาถูก สามารถเพิ่มดัชนีสำหรับทุกโอกาสได้ตามสบาย ขออภัยแอดมิน...