יצירה וניהול של אינדקסים בעותקים לקריאה

בדף הזה מוסבר איך להוסיף אינדקסים ולבטל אותם ברפליקות לקריאה ב-Cloud SQL. בדרך כלל, רפליקה היא לקריאה בלבד, אבל יכול להיות שתרצו ליצור אינדקסים משניים בטבלאות למטרות דיווח. ‫Cloud SQL מציע קבוצה של פרוצדורות מאוחסנות לניהול האינדקסים האלה.

הסברים על המונחים

  • אינדקס מקובץ. האינדקס הראשי בטבלת MySQL שמסדר פיזית את השורות בדיסק. כשמגדירים מפתח ראשי בטבלה, MySQL משתמש בו כמדד מקובץ. יכול להיות רק אינדקס מקובץ אחד בטבלה.
  • אינדקס משני. אינדקס נוסף בטבלת MySQL שמבצע אופטימיזציה של ביצועי השאילתות.

תהליכים מאוחסנים לאינדקסים

‫Cloud SQL כולל שתי פרוצדורות מאוחסנות בסכימה mysql שבהן אפשר להשתמש כדי להוסיף ולשחרר אינדקסים משניים בעותק לקריאה של MySQL. שימו לב: אמנם אפשר להריץ את הפרוצדורות האלה במופע של מקור ראשי, אבל הן מיועדות למופעים של רפליקות לקריאה.

mysql.addSecondaryIdxOnReplica
Adds a secondary index on the database. התהליך המאוחסן הזה הוא עטיפה (wrapper) של הצהרת ה-DDL‏ CREATE INDEX.

פרמטרים:

  • idxType – סוג האינדקס שרוצים ליצור. לדוגמה, מעבירים UNIQUE כדי ליצור אינדקס ייחודי.
  • idxName – שם האינדקס.
  • tableName – שם הטבלה בפורמט של schema.name.
  • idxDefinition – הגדרה של האינדקס. אין לכלול סוגריים חיצוניים.
  • idxOption – כל האפשרויות הנוספות להעברה יצירת אינדקס. לדוגמה, ב-MySQL 8.0, אפשר להעביר את האפשרות INVISIBLE לאינדקס בלתי נראה.

תחביר:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
Drops a secondary index on the database. התהליך המאוחסן הזה הוא עטיפה (wrapper) של הצהרת ה-DDL‏ DROP INDEX.

פרמטרים:

  • idxName – שם האינדקס.
  • tableName – שם הטבלה בפורמט של schema.name.
  • idxOption – אפשרויות נוספות להעברה כשמבטלים אינדקס. לדוגמה, אפשרות אלגוריתם כמו INPLACE.

תחביר:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

לפרמטרים idxType ו-idxOption, אפשר לעיין במסמכי התיעוד של הגרסה הראשית של MySQL שפועלת במכונת Cloud SQL.

דוגמאות

שימוש נכון

ריכזנו כאן כמה דוגמאות להפעלת הפרוצדורות. נניח שיש לנו טבלה עם ההגדרה הבאה.

CREATE TABLE sampletest.t1(
   id int(10) unsigned NOT NULL AUTO_INCREMENT,
   first_name varchar(64) NOT NULL,
   last_name varchar(64) NOT NULL,
   license_id int NOT NULL,
   PRIMARY KEY (id),
   KEY idx_fname (first_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

אם רוצים ליצור אינדקס רגיל בשם t1_fname_lname בעמודות first_name ו-last_name, מריצים את הפקודה הבאה:

call mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')

אם רוצים גם ליצור אינדקס ייחודי בשם t1_license_id בעמודה license_id עם התגובה "unique license id", מריצים את הפקודה הבאה:

call mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment \"unique license id\"')

אם רוצים להסיר את האינדקס t1_fname_lname, מריצים את הפקודה הבאה:

call mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')

שימוש לא נכון

הניסיון הבא ליצור אינדקס בעמודות first_name ו-last_name נכשל בגלל הסוגריים החיצוניים בפרמטר idxDefinition.

call mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')

אפשר להוסיף אינדקסים רק לטבלאות שנוצרו על ידי הלקוח. הניסיון הבא ליצור אינדקס בעמודת המארח של הטבלה mysql.servers נכשל.

call mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')

אפשר להשתמש בהליך dropSecondaryIdxOnReplica רק כדי להסיר אינדקסים שנוצרו קודם באמצעות ההליך addSecondaryIdxOnReplica. לדוגמה, הקריאה הבאה להסרת האינדקס הקיים idx_fname נכשלת.

call mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')

הזרקת SQL בקריאות לפרוצדורות האלה תיכשל. לדוגמה, הזרקת ה-SQL הבאה עם רצף של הערות תיכשל.

call mysql.addSecondaryIdxOnReplica(\"user 'a'@'%' --\", 'idx_fname', 'sampletest.t1', 'first_name', '')

באופן דומה, ניסיון הזרקת SQL זה עם תו מפריד נכשל.

call mysql.addSecondaryIdxOnReplica('', 'idx_fname', 'sampletest.t1', 'first_name', ';flush status')

יצירה מחדש של עותקים לקריאה

לפעמים, כשיש בעיה, Cloud SQL יוצר מחדש רפליקה לקריאה מהמקור הראשי כדי לשחזר במהירות את המופע. אינדקסים שנוצרו ברפליקה לקריאה לפני פעולת יצירה מחדש לא נשמרים. הלקוח אחראי ליצור מחדש את האינדקסים האלה באמצעות הפרוצדורות המאוחסנות בעותק הקריאה.

המאמרים הבאים