הרצת שאילתות מאוחדות ב-MySQL

כמנתחי נתונים, אתם יכולים להריץ שאילתות על נתונים רלציוניים שנמצאים ב-MySQL ישירות מ-BigQuery בזמן אמת, בלי להעתיק או להעביר נתונים.

כדי להתחבר למנועים של מסדי נתונים ב-MySQL, האיחוד של BigQuery עם MySQL משתמש ב-BigQuery Connection API. אחר כך אפשר להשתמש בפונקציה EXTERNAL_QUERY כדי לשלוח את שאילתת ה-SQL ישירות ל-MySQL לביצוע, והתוצאות מועברות ישירות בחזרה.

מגבלות

שאילתות מאוחדות ב-MySQL כפופות למגבלות הבאות:

  • אפשר להריץ רק שאילתות לקריאה בלבד באמצעות הפונקציה EXTERNAL_QUERY. אין תמיכה בהצהרות של שפת הגדרת נתונים (DDL) ושל שפת טיפול בנתונים (DML).
  • אפשר לגשת לאיחוד רק דרך הפונקציה EXTERNAL_QUERY. אי אפשר ליצור טבלאות חיצוניות או מערכי נתונים קבועים ב-BigQuery שממופים ישירות לטבלאות MySQL.
  • יכול להיות שזמן האחזור של שאילתה מאוחדת יהיה ארוך יותר באופן משמעותי מאשר הרצת השאילתה ישירות ב-MySQL.
  • יכול להיות ששירות החיבור הבסיסי יעביר חיבורים לא פעילים למצב שינה. השאילתה הראשונה שמשתמשת בחיבור MySQL אחרי תקופה של חוסר פעילות עשויה להימשך יותר מדקה, בזמן שהמחבר מבצע אתחול.
  • אין תמיכה בקישור בין רשתות שכנות (peering) ב-DNS. צריך להתחבר באמצעות כתובת IP או שם מארח שניתן לפתור באופן מלא ברשת ה-VPC.
  • בשאילתת MySQL SQL צריך לציין כינויים מפורשים לעמודות שמכילות תוצאות או ביטויים של פונקציות (לדוגמה, SELECT COUNT(*) AS total_count). ביטויים ללא כינויים יוצרים שמות של עמודות עם תווים מיוחדים שלא חוקיים בהגדרות הסכימה של טבלאות ב-BigQuery.
  • אם השימוש ב-Compute Engine API בפרויקט השאילתה מוגבל על ידי VPC Service Controls, השאילתה המאוחדת נכשלת אם החיבור משתמש במחבר רשת. מוודאים שמוגדרים כללים מתאימים לתעבורת נתונים נכנסת ויוצאת ב-VPC Service Controls.
  • אין תמיכה בדחיפות SQL נוספות ב-MySQL. מסננים וצבירות בשאילתת BigQuery החיצונית לא נדחפים למטה אל השאילתה הפנימית בתוך הפונקציה EXTERNAL_QUERY. כדי להגביל את השורות והעמודות שמועברות ברשת, צריך לציין פרדיקטים והיטלי עמודות ישירות בתוך הצהרת ה-SQL הפנימית של MySQL.

  • יש תמיכה רק באימות של שם משתמש וסיסמה במסד הנתונים של MySQL. אין תמיכה בספקי זהויות של צד שלישי, ב-Kerberos ובאימות IAM של ספק שירותי ענן.

  • ‫הצהרות CREATE TABLE ... AS SELECT (CTAS) נכשלות עם שגיאות Unsupported type INT32 או Unsupported type FLOAT אם השאילתה בוחרת עמודות של מספרים שלמים של 32 ביט (TINYINT,‏ SMALLINT ו-BOOLEAN / TINYINT(1)) או עמודות של מספרים ממשיים עם דיוק יחיד (FLOAT). כדי לשמור את תוצאות השאילתה בטבלה חדשה ב-BigQuery, צריך להמיר באופן מפורש עמודות של מספרים שלמים ל-INT64 ועמודות של מספרים ממשיים ל-FLOAT64 בשאילתה:

    CREATE TABLE mydataset.mytable AS
    SELECT
    CAST(tiny_col AS INT64) AS tiny_col,
    CAST(small_col AS INT64) AS small_col,
    ...
    FROM EXTERNAL_QUERY(...);

    הוספה לטבלה קיימת עם INSERT INTO <table> SELECT ... מתבצעת בלי המרות ידניות, כי BigQuery מרחיב באופן אוטומטי את הערכים של INT32 ו-FLOAT כך שיתאימו לעמודות INT64 ו-FLOAT64 בטבלת היעד.

  • למרות שהעמודות DECIMAL ו-NUMERIC ב-MySQL ממופות ל-BIGNUMERIC(76, 38), ב-MySQL אפשר להגיע לרמת דיוק של עד 65. אם ערך מכיל יותר מ-38 ספרות של מספר שלם (הדיוק פחות קנה המידה גדול מ-38), הוא חורג מטווח המספרים השלמים של BIGNUMERIC והשאילתה נכשלת בזמן הריצה. כדי לשלוח שאילתות על ערכים עם יותר מ-38 ספרות של מספרים שלמים, צריך להמיר אותם ל-CHAR או ל-VARCHAR בהצהרת EXTERNAL_QUERY.

  • סוג הנתונים TIME ב-MySQL חותך ערכים חלקיים של פחות משנייה (מיקרו-שנייה) לשניות שלמות (לדוגמה, 12:34:56.789123 הופך ל-12:34:56). בנוסף, TIME ב-MySQL תומך במשכי זמן שחלפו מ--838:59:59 עד 838:59:59, ואילו TIME ב-BigQuery תומך רק בערכים של שעה ביום מ-00:00:00 עד 23:59:59.999999. ערכים מחוץ לטווח שבין 00:00:00 ל-23:59:59 גורמים לשגיאות בשאילתות בזמן הריצה. אם נדרשים ערכים של דיוק במיקרו-שניות או של משך הזמן שחלף, צריך להמיר את העמודה ל-CHAR או ל-VARCHAR בתוך ההצהרה EXTERNAL_QUERY.

  • תאריכים וחותמות זמן שלפני 15 באוקטובר 1582 כפופים לשינוי של 10 ימים בלוח השנה, בגלל המעבר ההיסטורי ללוח השנה הגרגוריאני. כדי לשמור על תאריכים היסטוריים מדויקים לפני שנת 1582, צריך להמיר אותם ל-CHAR או ל-VARCHAR בהצהרת EXTERNAL_QUERY.

גרסאות וסביבות נתמכות של MySQL

איחוד שאילתות תומך במסדי נתונים של MySQL בסביבות הפריסה הבאות:

  • מסדי נתונים של MySQL שמתארחים בענן או באתר, שאפשר לגשת אליהם באמצעות כתובות IP ציבוריות או מחברי רשת (דרך Cloud VPN או Cloud Interconnect)
  • מכונות MySQL באירוח עצמי ב-Compute Engine או בתשתית אחרת
  • ‫MySQL 8.4 LTS ו-8.0

לפני שמתחילים

מוודאים שהאדמין ב-BigQuery יצר חיבור ל-MySQL ושיתף אותו איתכם.

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות לשליחת שאילתות ל-MySQL, צריך לבקש מהאדמין להקצות לכם את התפקיד משתמש בחיבורים של BigQuery (roles/bigquery.connectionUser) ב-IAM בפרויקט. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

נתוני שאילתות

כדי לשלוח שאילתה מאוחדת ל-MySQL משאילתת GoogleSQL, משתמשים בפונקציה EXTERNAL_QUERY.

הדוגמה הבאה היא שאילתה מאוחדת שמצרפת רשומות של לקוחות ב-BigQuery בשם mydataset.customers עם הזמנות של עסקאות מכירה ב-MySQL:

SELECT
  c.customer_id,
  c.name,
  fo.first_order_date
FROM
  mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
  'projects/my-project/locations/us-central1/connections/mysql_prod_conn',
  '''SELECT CUSTOMER_ID, MIN(ORDER_DATE) AS first_order_date
     FROM ORDERS
     GROUP BY CUSTOMER_ID''') AS fo
  ON fo.customer_id = c.customer_id
GROUP BY
  c.customer_id,
  c.name,
  fo.first_order_date;

הצגת סכימה של טבלת MySQL

אתם יכולים לשלוח שאילתות לתצוגות INFORMATION_SCHEMA של MySQL דרך EXTERNAL_QUERY כדי לבדוק את המטא-נתונים של מסד הנתונים, לגלות טבלאות ולעיין בסכימות של עמודות לפני הרצת ניתוח.

רשימה של כל מסדי הנתונים

SELECT *
FROM EXTERNAL_QUERY(
  'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID',
  '''SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME
     FROM INFORMATION_SCHEMA.SCHEMATA''');

רשימה של טבלאות במסד נתונים

SELECT *
FROM EXTERNAL_QUERY(
  'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID',
  """SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE
     FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_SCHEMA = 'DATABASE_NAME'""");

הצגת עמודות וסוגי נתונים בטבלה

SELECT *
FROM EXTERNAL_QUERY(
  'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID',
  """SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_TYPE
     FROM INFORMATION_SCHEMA.COLUMNS
     WHERE TABLE_SCHEMA = 'DATABASE_NAME' AND TABLE_NAME = 'TABLE_NAME'""");

מיפוי סוגי נתונים

כשמריצים שאילתה מאוחדת, BigQuery ממיר את הנתונים מ-MySQL לסוגי נתונים של GoogleSQL, בהתאם לטבלה הבאה:

סוג הנתונים ב-MySQL סוג הנתונים ב-BigQuery
סוגים מספריים
BOOLEAN, BOOL, TINYINT(1) ‫INT64 (שאילתות אינטראקטיביות; ראו מגבלות של CREATE TABLE ... AS SELECT)
TINYINT, SMALLINT ‫INT64 (שאילתות אינטראקטיביות; ראו מגבלות של CREATE TABLE ... AS SELECT)
MEDIUMINT, INT, INTEGER INT64
BIGINT INT64
BIGINT UNSIGNED, BIGINT ZEROFILL, SERIAL BIGNUMERIC(76, 38)
DECIMAL,‏ DEC,‏ NUMERIC,‏ FIXED BIGNUMERIC(76, 38)
FLOAT ‫FLOAT64 (שאילתות אינטראקטיביות; ראו מגבלות של CREATE TABLE ... AS SELECT)
DOUBLE, DOUBLE PRECISION, REAL FLOAT64
סוגי תאריך ושעה
DATE DATE
DATETIME DATETIME
TIMESTAMP TIMESTAMP
TIME TIME
סוגי מחרוזות וטקסט
CHAR STRING
VARCHAR STRING
BINARY BYTES
VARBINARY BYTES
TINYBLOB,‏ BLOB,‏ MEDIUMBLOB,‏ LONGBLOB BYTES
TINYTEXT,‏ TEXT,‏ MEDIUMTEXT,‏ LONGTEXT STRING
ENUM STRING
SET STRING

תמחור

העלות של הרצת שאילתה מאוחדת מבוססת על שלושה גורמים:

  • עלות החישוב של הרצת השאילתה ב-MySQL (החיוב מתבצע על ידי ספק מסד הנתונים של MySQL או סביבת האירוח)
  • עלות רוחב הפס של העברת תוצאות השאילתה מ-MySQL ל-BigQuery (חיובים על תעבורת נתונים יוצאת ברשת מספק האירוח של מסד הנתונים)
  • עלות המחשוב של הרצת השאילתה ב-BigQuery

כל עלויות המחשוב ותעבורת הנתונים היוצאת של MySQL מחויבות ישירות על ידי ספק MySQL או מארח התשתית, ולא על ידי Google. כדי להגביל את עלות רוחב הפס, מומלץ לכתוב את השאילתה בהצהרה EXTERNAL_QUERY כך שהיא לא תכלול את כל העמודות והשורות שלא נדרשות לחישוב התוצאה הסופית.

אין עלות נוספת להרצת שאילתות מאוחדות ב-BigQuery. מידע נוסף על התמחור ב-BigQuery

אם החיבור שלכם משתמש ברכיבי רשת של Google Cloud , יכול להיות שיחולו גם המחירים הבאים:

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