API ופיתוח Backend 06/03/2026 2 דק׳ קריאה

אופטימיזציית MySQL לאתרי תוכן גדולים: מדריך מקצועי לפתרון בעיות ביצועים בפיתוח אתרים

פבלו רותם · 0 תגובות
Pablo Guides - אופטימיזציית MySQL לאתרי תוכן גדולים: מדריך מקצועי לפתרון בעיות ביצועים בפיתוח אתרים

אופטימיזציית MySQL לאתרי תוכן גדולים
מדריך מקצועי לפתרון בעיות ביצועים בפיתוח אתרים

אתרי תוכן גדולים – כמו פורטלים, אתרי חדשות, ספריות וידאו, אתרי נדל״ן או מאגרי מידע – מתמודדים עם עומסי בסיס נתונים משמעותיים. כאשר בסיס הנתונים מגיע למיליוני רשומות, שאילתות לא אופטימליות או הגדרות שרת לא נכונות עלולות לגרום להאטה קשה באתר.

במדריך זה נסקור שיטות מקצועיות לאופטימיזציה של MySQL / MariaDB עבור אתרים גדולים, כולל:

אופטימיזציה של שאילתות

שימוש נכון באינדקסים

הגדרות שרת מתקדמות

שיטות לייבוא נתונים עצומים

אופטימיזציה של טבלאות גדולות

טכניקות caching

1. זיהוי צווארי בקבוק בבסיס הנתונים

לפני שמבצעים אופטימיזציה חשוב לזהות את מקור הבעיה.

בדיקת שאילתות איטיות

בשרת MySQL ניתן להפעיל Slow Query Log

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

הקובץ בדרך כלל נמצא:

/var/log/mysql/mysql-slow.log
ניתוח שאילתה באמצעות EXPLAIN
EXPLAIN SELECT *
FROM posts
WHERE category_id = 12
ORDER BY created_at DESC
LIMIT 20;

פלט ה-EXPLAIN יראה:

האם משתמשים באינדקס

האם מתבצע FULL TABLE SCAN

כמה שורות נסרקות

2. שימוש נכון באינדקסים (Indexes)

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

יצירת אינדקס
CREATE INDEX idx_category
ON posts(category_id);
אינדקס מרובה עמודות

מתאים לשאילתות מורכבות.

CREATE INDEX idx_category_date
ON posts(category_id, created_at);

שאילתה שתשתמש באינדקס:

SELECT *
FROM posts
WHERE category_id = 5
ORDER BY created_at DESC
LIMIT 20;
אינדקס לטקסטים גדולים
ALTER TABLE articles
ADD FULLTEXT(title, content);

חיפוש:

SELECT *
FROM articles
WHERE MATCH(title,content)
AGAINST('mysql optimization');
3. אופטימיזציה של טבלאות גדולות

כאשר טבלה מגיעה למיליוני רשומות, מבנה נכון הוא קריטי.

שימוש במנוע InnoDB
ALTER TABLE posts ENGINE=InnoDB;
שימוש במפתחות ראשיים יעילים

טעות נפוצה היא שימוש ב-UUID.

עדיף:

id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
שימוש נכון בטיפוסי נתונים

לא להשתמש ב-INT כאשר מספיק SMALLINT.

דוגמה:

status TINYINT
views INT UNSIGNED
category_id INT UNSIGNED
4. Partitioning לטבלאות ענק

כאשר טבלה מגיעה לעשרות מיליוני רשומות.

לדוגמה לפי שנה.

CREATE TABLE logs (
id BIGINT,
created_at DATETIME,
message TEXT
)
PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);

יתרון:

MySQL סורק רק partition רלוונטי.

5. אופטימיזציה של שרת MySQL / MariaDB

קובץ:

/etc/mysql/my.cnf

או

/etc/my.cnf
הגדרות קריטיות לאתרי תוכן גדולים
[mysqld]

innodb_buffer_pool_size = 8G
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 2

max_connections = 500

query_cache_type = 0
query_cache_size = 0

tmp_table_size = 256M
max_heap_table_size = 256M

table_open_cache = 4000

thread_cache_size = 100
כלל אצבע
innodb_buffer_pool_size

צריך להיות:

70-80% מה-RAM בשרת

6. שיפור ביצועים בשאילתות מורכבות
הימנעות מ-SELECT *

לא נכון:

SELECT *
FROM posts

נכון:

SELECT id,title,created_at
FROM posts
שימוש ב-LIMIT
SELECT id,title
FROM posts
ORDER BY created_at DESC
LIMIT 20;
הימנעות מ-OFFSET גדול

שאילתה גרועה:

LIMIT 100000,20

פתרון:

Pagination לפי ID.

SELECT *
FROM posts
WHERE id < 500000
ORDER BY id DESC
LIMIT 20;
7. אופטימיזציה לייבוא נתונים עצומים

כאשר מייבאים מאות אלפי רשומות.

הדרך האיטית
INSERT INTO posts (title,content)
VALUES ('a','b');

כל שורה בנפרד.

הדרך המהירה
Multi insert
INSERT INTO posts (title,content)
VALUES
('a','b'),
('c','d'),
('e','f');
הדרך המהירה ביותר
LOAD DATA INFILE
LOAD DATA INFILE '/tmp/posts.csv'
INTO TABLE posts
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(title,content);

פי 20-50 מהר יותר.

8. השבתת אינדקסים בזמן יבוא

בעת יבוא מיליוני רשומות.

ALTER TABLE posts DISABLE KEYS;

לאחר סיום:

ALTER TABLE posts ENABLE KEYS;
9. שימוש בטבלאות זמניות

כאשר יש חישובים מורכבים.

CREATE TEMPORARY TABLE tmp_results
SELECT id,title
FROM posts
WHERE category_id=5;
10. שימוש ב-Caching

הפחתת עומס על MySQL.

Redis
Memcached

דוגמה בפיתוח PHP:

SELECT id,title
FROM posts
ORDER BY created_at DESC
LIMIT 20
");

$rows = $result->fetch_all(MYSQLI_ASSOC);

$redis->setex($key,60,json_encode($rows));

$data = json_encode($rows);
}

echo $data;
11. תחזוקה תקופתית
OPTIMIZE TABLE
OPTIMIZE TABLE posts;
ANALYZE TABLE
ANALYZE TABLE posts;
בדיקת גודל טבלאות
SELECT
table_name,
ROUND(data_length/1024/1024) AS data_mb,
ROUND(index_length/1024/1024) AS index_mb
FROM information_schema.tables
WHERE table_schema = 'mydatabase'
ORDER BY data_length DESC;
12. ניטור ביצועים

כלים מומלצים:

MySQLTuner

Percona Toolkit

PMM – Percona Monitoring

Grafana + Prometheus

סיכום

כאשר אתר תוכן גדל למיליוני רשומות, הביצועים תלויים בכמה גורמים מרכזיים:

אינדקסים נכונים

שאילתות יעילות

הגדרות שרת מותאמות

caching חכם

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

ניטור מתמיד

יישום נכון של שיטות אלו יכול לשפר ביצועים פי 10-100 באתרים גדולים.