בדף הזה נסביר איך להגדיר את הזיכרון לאינדקסים של וקטורים, ואיך ליצור, לשפר, לנטר ולמחוק אינדקסים של וקטורים.
לפני שמתחילים
לפני שיוצרים אינדקס וקטורי, צריך לטעון נתונים לטבלת הבסיס עם ערכי הטמעה וקטוריים. טבלת הבסיס צריכה לכלול לפחות 1,000 שורות. אם יש לכם יותר נקודות נתונים זמינות, תוכלו לקבל חלוקה טובה יותר לאזורים ואימון טוב יותר של האינדקס.
הגדרת הקצאת זיכרון לאינדקסים של וקטורים
הדגל של מסד הנתונים cloudsql_vector_max_mem_size קובע כמה זיכרון מכונת Cloud SQL מקצה לאינדקסים של וקטורים. זהו דגל סטטי שנדרשת הפעלה מחדש של המכונה כדי להשתמש בו. הזיכרון הזה משמש לשתי מטרות עיקריות:
אחסון המבנה של אינדקס הווקטורים: החלק שאינו עלה של אינדקס הווקטורים (
TREE_MEMORY) נמצא בזיכרון הזה. הגודל המשוער של העץ הזה תלוי במספר צמתי העלה (num_leaves) ובממדים של הווקטורים:Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2לדוגמה, לאינדקס עם 1,000 עלים ו-768 מימדים יהיה ערך משוער של
TREE_MEMORYבגודל 1,000 * 768 * 4 * 2 או 6,144,000 בייט. אפשר גם לבדוק אתTREE_MEMORYבפועל באמצעות הטבלהinformation_schema.innodb_vector_indexes. Cloud SQL מנהל את הזיכרון הזה. אין צורך להקצות מקום לכל אינדקס וקטורי בו-זמנית, כי אינדקסים לא פעילים נפרקים כדי לפנות מקום לבקשות אחרות.זיכרון ליצירת אינדקס (נתוני אימון): במהלך יצירת אינדקס וקטורי, נדרש זיכרון לעיבוד מדגם של הנתונים מהטבלה הבסיסית כדי לבנות את האינדקס. הזיכרון הזה נמצא בשימוש רק במהלך תהליך יצירת האינדקס, ומתפנה לאחר מכן. הגודל המשוער של הזיכרון שנדרש לאימון הוא:
approximate_training_memory = num_rows in base table * 0.1 * 4 * vector dimensionsלדוגמה, אם יש לכם טבלה עם 1,000,000 שורות ו-768 מאפיינים, הערך של
training_memoryיהיה 1,000,000 * 0.1 * 768 * 4 או 307,200,000 בייטים. רק 10% מהנתונים בטבלת הבסיס נדגמים כדי לחשב את מרכזי הכובד של העץ.כשמפעילים את הדגל
cloudsql_vector, מערכת Cloud SQL מגדירה באופן אוטומטי ערך ברירת מחדל שלcloudsql_vector_max_mem_sizeעל סמך גודל המכונה הווירטואלית. בדרך כלל ברירת המחדל הזו מספיקה לעומסי עבודה טיפוסיים. Cloud SQL מקטין את הערך של הדגלinnodb_buffer_pool_sizeכדי להקצות את הזיכרון הזה. ערך ברירת המחדל המקסימלי שלcloudsql_vector_max_mem_sizeהוא 16GB. אם אתם צריכים לשנות את גודל הזיכרון, אתם יכולים לשנות אתcloudsql_vector_max_mem_sizeבאופן דינמי בהתאם לשימוש שלכם באינדקס הווקטורים.חשוב: אם מגדילים את
cloudsql_vector_max_mem_size, צריך להקטין אתinnodb_buffer_pool_sizeבהתאם כדי למנוע בעיות בזיכרון.
ערכים של cloudsql_vector_max_mem_size
| גודל ה-VM | cloudsql_vector_max_mem_size |
| 4GB | 194MB |
| 8GB | 515MB |
| 16GB | 1.2GB |
| 32GB | 2.56GB |
| 64GB | 5.12GB |
| 128GB | 10.24GB |
| 256GB ומעלה | 16GB |
טווח הזיכרון שמוקצה לאינדקס הווקטורי הוא:
- מינימום 128MB
- 10% ממאגר הנתונים הזמני
- עד 16GB
אפשר לשנות את הזיכרון בהמשך, לפי הצורך. מידע נוסף זמין במאמר הפעלת הדגל של מסד הנתונים להטמעות וקטוריות.
מידע על מעקב אחר הגודל של אינדקס וקטורי זמין במאמר מעקב אחר אינדקסים וקטוריים.
כדי לעדכן את הזיכרון שהוקצה לאינדקסים של וקטורים במופע, משתמשים בפקודה הבאה:
gcloud sql instances patch INSTANCE_NAME \
--database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE;
מחליפים את מה שכתוב בשדות הבאים:
- INSTANCE_NAME: שם המופע שבו משנים את הקצאת הזיכרון.
- NEW_MEMORY_VALUE: הקצאת הזיכרון המעודכנת, בבייטים, לאינדקסים של הווקטורים.
השינוי הזה ייכנס לתוקף מיד אחרי הפעלה מחדש של מסד הנתונים.
יצירת אינדקס וקטורי
יש שתי דרכים ליצור אינדקס וקטורי:
-
CREATE VECTOR INDEXstatement, תוסף של Cloud SQL לתחביר הסטנדרטי של MySQL. - הצהרת
ALTER TABLEעם תוסף הסעיףADD VECTOR INDEXשל Cloud SQL. אי אפשר להריץ את ההצהרה הזו בו-זמנית עם הצהרות DDL אחרות בטבלה.
כדי ליצור אינדקס וקטורי באמצעות CREATE VECTOR INDEX, משתמשים בתחביר הבא:
CREATE
VECTOR INDEX INDEX_NAME
ON TABLE_NAME(COLUMN_NAME)
USING
SCANN[QUANTIZER = SQ8]
DISTANCE_MEASURE
= L2_SQUARED | COSINE | DOT_PRODUCT[NUM_LEAVES = INT_VALUE { '</var>' }}];
אלה האפשרויות של האינדקס:
-
USING SCANN: אופציונלי. מציין את סוג האינדקס שבו צריך להשתמש. SCANN הוא הערך הנתמך היחיד. -
QUANTIZER: אופציונלי. מיפוי של וקטור עם הרבה ממדים לייצוג דחוס. הערך הנתמך היחיד הוא SQ8. -
DISTANCE_MEASURE: חובה. מציינת נוסחה מתמטית לחישוב הדמיון בין שני וקטורים. בפרמטר הזה צריך להגדיר את אותו מרחק שהגדרתם באפשרויות החיפושapprox_distance. הליטרלים הנתמכים הם:L2_SQUAREDCOSINEDOT_PRODUCT
-
NUM_LEAVES: אופציונלי. מציינים כמה מחיצות (ענפים) ליצור. כדאי לשנות את ההגדרה הזו מברירת המחדל רק אם אתם מבינים היטב את החיפוש ברשתות עצביות מלאכותיות ואת מערך הנתונים שלכם. המספר שצוין לא יכול להיות גדול ממספר ההטמעות בטבלת הבסיס.
לדוגמה, כדי ליצור אינדקס וקטורי, מריצים את הפקודה הבאה:
CREATE
VECTOR INDEX vectorIndex
ON dbname.books(embeddings) DISTANCE_MEASURE = L2_SQUARED;
בזמן שההצהרה CREATE פועלת, טבלת הבסיס עוברת למצב קריאה בלבד ולא ניתן לבצע פעולות DML בטבלת הבסיס.
כדי ליצור אינדקס בטבלה קיימת, אפשר להשתמש בתחביר הבא:
ALTER TABLE tbl_name
ADD VECTOR INDEX index_name(key_part)[index_option];
לדוגמה, כדי ליצור אינדקס בטבלה קיימת:
ALTER TABLE t1 ADD VECTOR INDEX index1(j)
USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared NUM_LEAVES = 10;
שיפור האינדקס של הווקטורים
בקטע הזה מופיע מידע נוסף על הפרמטרים שבהם משתמשים כדי ליצור את אינדקס הווקטורים. כדי לכוונן את אינדקס הווקטור, משתמשים במידע הזה כדי לקבוע איך להשפיע על תהליך build.
| פרמטר | תיאור | ברירת מחדל | היקף | השפעה |
cloudsql_vector_max_mem_size |
הזיכרון שהוקצה לאימון האינדקס. | משתנה | Instance | זיכרון לא מספיק עלול לגרום לכשלים בבנייה. מידע נוסף מופיע במאמר בנושא הגדרת הקצאת זיכרון לאינדקסים של וקטורים. |
innodb_ddl_threads |
רמת המקביליות של אימון האינדקס ובנייתו. | 4 | אירוע | ערכים גבוהים יותר מקצרים את משך זמן של תהליך build, אבל מגדילים את עומס המעבד. הערך הזה צריך להיות מספר המעבדים שאפשר להקצות בלי להשפיע לרעה על פעולות מסד הנתונים. |
מוודאים שcloudsql_vector_max_mem_size מוגדר בצורה מתאימה לאימון.
כדאי לשנות את הערך של innodb_ddl_threads כדי לאזן בין משך זמן של תהליך build לעומס המעבד, תוך התחשבות בהשפעה על פעולות מקבילות במסד הנתונים. מעקב אחרי ניצול המעבד (CPU) במהלך הבנייה.
הסרת אינדקס וקטורי
כדי להסיר אינדקס וקטורי, משתמשים בהצהרות SQL DROP INDEX או ALTER TABLE עם שם האינדקס שרוצים להסיר, כמו בדוגמה הבאה:
DROP INDEX index_name ON books;
ALTER TABLE table_name
DROP INDEX index_name;
מעקב אחרי אינדקסים של וקטורים
ב-Cloud SQL יש טבלאות של סכימת מידע עם נתונים בזמן אמת על אינדקסים של וקטורים שנטענו בזיכרון שלו:
information_schema.innodb_vector_indexesמציגה רשימה של כל האינדקסים של הווקטורים שנפתחים בזיכרון אחרי הפעלה מחדש.-
information_schema.innodb_all_vector_indexesמציג את כל אינדקסים של וקטורים שקיימים במופע (גם אם הם עדיין לא נפתחו בזיכרון). -
information_schema.innodb_vector_indexes_memoryמספק מידע על השימוש הכולל בזיכרון של אינדקסים וקטוריים במופע.
מידע מפורט יותר זמין במאמר בנושא סכימת מידע.
כדי לראות את המידע בטבלה innodb_vector_indexes, מריצים את הפקודה הבאה:
SELECT * FROM information_schema.innodb_vector_indexes \ G;
הפלט אמור להיראות כך:
INDEX_NAME: t1_vec_index
TABLE_NAME: test.t1
INDEX_TYPE: TREE_SQ
DIMENSION: 3
DIST_MEASURE: COSINE
STATUS: Ready
STATE: INDEX_READY_TO_USE
NUM_LEAVES: 10
NUM_LEAVES_TO_SEARCH: 10
QUERIES: 1
MUTATIONS: 1
TREE_MEMORY: 443
המאמרים הבאים
- מומלץ לקרוא את הסקירה הכללית על חיפוש וקטורים ב-Cloud SQL.
- איך מפעילים ומשביתים הטמעות וקטוריות במכונה
- איך יוצרים הטמעות וקטוריות
- איך מבצעים חיפושים בהטמעות וקטוריות