MySQL ไม่อนุญาตให้จัดทำดัชนีเต็มมูลค่าของBLOB
, TEXT
และระยะยาวVARCHAR
คอลัมน์เนื่องจากข้อมูลที่พวกเขามีได้มากและโดยปริยายดัชนี DB จะมีขนาดใหญ่หมายถึงผลประโยชน์จากดัชนีไม่มี
MySQL ต้องการให้คุณกำหนดตัวอักษร N ตัวแรกที่จะทำดัชนีและเคล็ดลับคือเลือกหมายเลข N ที่ยาวพอที่จะให้การเลือกที่ดี แต่สั้นพอที่จะประหยัดพื้นที่ คำนำหน้าควรยาวพอที่จะทำให้ดัชนีเกือบมีประโยชน์เท่าที่ควรหากคุณทำดัชนีทั้งคอลัมน์
ก่อนที่เราจะไปไกลกว่านั้นให้เรานิยามคำศัพท์ที่สำคัญบางอย่าง ดัชนีหัวกะทิคืออัตราส่วนของค่าดัชนีรวมและจำนวนแถวทั้งหมด นี่คือตัวอย่างหนึ่งสำหรับตารางทดสอบ:
+-----+-----------+
| id | value |
+-----+-----------+
| 1 | abc |
| 2 | abd |
| 3 | adg |
+-----+-----------+
หากเราทำดัชนีเฉพาะอักขระตัวแรก (N = 1) ตารางดัชนีจะมีลักษณะดังนี้ตารางต่อไปนี้:
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| a | 1,2,3 |
+---------------+-----------+
ในกรณีนี้การเลือกดัชนีเท่ากับ IS = 1/3 = 0.33
ให้เราดูว่าจะเกิดอะไรขึ้นถ้าเราเพิ่มจำนวนอักขระที่จัดทำดัชนีเป็นสอง (N = 2)
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| ab | 1,2 |
| ad | 3 |
+---------------+-----------+
ในสถานการณ์นี้คือ = 2/3 = 0.66 ซึ่งหมายความว่าเราเพิ่มการเลือกดัชนี แต่เรายังเพิ่มขนาดของดัชนีด้วย เคล็ดลับคือการหาจำนวน N น้อยที่สุดซึ่งจะส่งผลให้สูงสุดหัวกะทิดัชนี
มีสองวิธีที่คุณสามารถทำการคำนวณสำหรับตารางฐานข้อมูลของคุณ ฉันจะทำการสาธิตเกี่ยวกับการถ่ายโอนข้อมูลฐานข้อมูลนี้นี้
สมมติว่าเราต้องการเพิ่มคอลัมน์last_nameในพนักงานตารางลงในดัชนีและเราต้องการกำหนดจำนวนNที่น้อยที่สุดซึ่งจะสร้างการเลือกดัชนีที่ดีที่สุด
ก่อนอื่นให้เราระบุนามสกุลที่พบบ่อยที่สุด:
select count(*) as cnt, last_name
from employees
group by employees.last_name
order by cnt
+-----+-------------+
| cnt | last_name |
+-----+-------------+
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Farris |
| 222 | Sudbeck |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Neiman |
| 218 | Mandell |
| 218 | Masada |
| 217 | Boudaillier |
| 217 | Wendorf |
| 216 | Pettis |
| 216 | Solares |
| 216 | Mahnke |
+-----+-------------+
15 rows in set (0.64 sec)
อย่างที่คุณเห็นนามสกุลบาบาเป็นชื่อที่พบบ่อยที่สุด ตอนนี้เรากำลังจะไปหาคำนำหน้าlast_name ที่เกิดขึ้นบ่อยที่สุดเริ่มต้นด้วยคำนำหน้าห้าตัวอักษร
+-----+--------+
| cnt | prefix |
+-----+--------+
| 794 | Schaa |
| 758 | Mande |
| 711 | Schwa |
| 562 | Angel |
| 561 | Gecse |
| 555 | Delgr |
| 550 | Berna |
| 547 | Peter |
| 543 | Cappe |
| 539 | Stran |
| 534 | Canna |
| 485 | Georg |
| 417 | Neima |
| 398 | Petti |
| 398 | Duclo |
+-----+--------+
15 rows in set (0.55 sec)
มีคำนำหน้าทั้งหมดเกิดขึ้นมากมายซึ่งหมายความว่าเราต้องเพิ่มหมายเลข N จนกว่าค่าจะใกล้เคียงกับตัวอย่างก่อนหน้านี้
นี่คือผลลัพธ์สำหรับ N = 9
select count(*) as cnt, left(last_name,9) as prefix
from employees
group by prefix
order by cnt desc
limit 0,15;
+-----+-----------+
| cnt | prefix |
+-----+-----------+
| 336 | Schwartzb |
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Sudbeck |
| 222 | Farris |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Mandell |
| 218 | Neiman |
| 218 | Masada |
| 217 | Wendorf |
| 217 | Boudailli |
| 216 | Cummings |
| 216 | Pettis |
+-----+-----------+
นี่คือผลลัพธ์สำหรับ N = 10
+-----+------------+
| cnt | prefix |
+-----+------------+
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Sudbeck |
| 222 | Farris |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Mandell |
| 218 | Neiman |
| 218 | Masada |
| 217 | Wendorf |
| 217 | Boudaillie |
| 216 | Cummings |
| 216 | Pettis |
| 216 | Solares |
+-----+------------+
15 rows in set (0.56 sec)
นี่เป็นผลลัพธ์ที่ดีมาก ซึ่งหมายความว่าเราสามารถสร้างดัชนีในคอลัมน์ที่last_name
มีการจัดทำดัชนีเพียง 10 ตัวแรก ในคอลัมน์คำจำกัดความของตารางlast_name
มีการกำหนดเป็นVARCHAR(16)
และหมายความว่าเราได้บันทึก 6 ไบต์ (หรือมากกว่านั้นถ้ามี UTF8 อักขระในนามสกุล) ต่อรายการ ในตารางนี้มี 1637 ค่าที่แตกต่างคูณด้วย 6 ไบต์มีค่าประมาณ 9KB และลองจินตนาการว่าตัวเลขนี้จะเติบโตได้อย่างไรถ้าตารางของเรามีจำนวนแถวนับล้าน
คุณสามารถอ่านวิธีการอื่น ๆ ในการคำนวณจำนวนNในการโพสต์ของฉันดัชนีคำนำหน้าใน MySQL
UNIQUE
คีย์?