[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-23-tashih-ada-qiraat-qaidat-bayanat-zaman-istijaba":3},{"article":4,"author":55},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":35,"related_articles":36},"d9000000-0000-0000-0000-000000000123","a0000000-0000-0000-0000-000000000096","Deep EVM #23: تصحيح الأداء — عندما تقتل قراءات قاعدة البيانات زمن الاستجابة","deep-evm-23-tashih-ada-qiraat-qaidat-bayanat-zaman-istijaba","تشخيص وإصلاح مشاكل الأداء المتعلقة بقاعدة البيانات: مشكلة N+1، الفهارس المفقودة، تجميع الاتصالات، وتحسين الاستعلامات في Rust مع sqlx.","## عندما تكون قاعدة البيانات عنق الزجاجة\n\nأكثر مشاكل الأداء شيوعاً في تطبيقات الويب ليست في الكود — بل في قاعدة البيانات. استعلام بطيء واحد يمكن أن يحول API سريع إلى كابوس.\n\n## مشكلة N+1\n\nالنمط الأكثر شيوعاً والأكثر ضرراً:\n\n```rust\n\u002F\u002F سيء: N+1 استعلام\nlet articles = sqlx::query_as::\u003C_, Article>(\"SELECT * FROM articles\")\n    .fetch_all(&pool).await?;\n\nfor article in &articles {\n    \u002F\u002F استعلام منفصل لكل مقالة!\n    let tags = sqlx::query_as::\u003C_, Tag>(\n        \"SELECT t.* FROM tags t JOIN article_tags at ON t.id = at.tag_id WHERE at.article_id = $1\"\n    )\n    .bind(article.id)\n    .fetch_all(&pool).await?;\n}\n\n\u002F\u002F جيد: استعلام واحد مع JOIN\nlet results = sqlx::query_as::\u003C_, ArticleWithTags>(\n    \"SELECT a.*, array_agg(t.name) as tags FROM articles a \n     LEFT JOIN article_tags at ON a.id = at.article_id\n     LEFT JOIN tags t ON t.id = at.tag_id\n     GROUP BY a.id\"\n)\n.fetch_all(&pool).await?;\n```\n\n## الفهارس المفقودة\n\n```sql\n-- استعلام بطيء بدون فهرس\nEXPLAIN ANALYZE SELECT * FROM articles WHERE slug = 'my-article';\n-- Seq Scan: 500ms\n\n-- إضافة فهرس\nCREATE INDEX idx_articles_slug ON articles(slug);\n\n-- بعد الفهرس\nEXPLAIN ANALYZE SELECT * FROM articles WHERE slug = 'my-article';\n-- Index Scan: 0.5ms\n```\n\n## تجميع الاتصالات\n\n```rust\nlet pool = PgPoolOptions::new()\n    .max_connections(50)\n    .min_connections(5)\n    .acquire_timeout(Duration::from_secs(5))\n    .idle_timeout(Duration::from_secs(300))\n    .connect(&database_url)\n    .await?;\n```\n\n## أدوات التشخيص\n\n- **EXPLAIN ANALYZE** — خطة تنفيذ الاستعلام\n- **pg_stat_statements** — إحصائيات الاستعلامات\n- **pgBadger** — تحليل سجلات PostgreSQL\n- **tracing مع sqlx** — تسجيل كل استعلام مع المدة\n\n## الخلاصة\n\nتصحيح أداء قاعدة البيانات يبدأ بالقياس. EXPLAIN ANALYZE لكل استعلام بطيء، فهارس للأعمدة المستخدمة في WHERE وJOIN، وتجنب مشكلة N+1 باستخدام JOIN.","\u003Ch2 id=\"\">عندما تكون قاعدة البيانات عنق الزجاجة\u003C\u002Fh2>\n\u003Cp>أكثر مشاكل الأداء شيوعاً في تطبيقات الويب ليست في الكود — بل في قاعدة البيانات. استعلام بطيء واحد يمكن أن يحول API سريع إلى كابوس.\u003C\u002Fp>\n\u003Ch2 id=\"n-1\">مشكلة N+1\u003C\u002Fh2>\n\u003Cp>النمط الأكثر شيوعاً والأكثر ضرراً:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">\u002F\u002F سيء: N+1 استعلام\nlet articles = sqlx::query_as::&lt;_, Article&gt;(\"SELECT * FROM articles\")\n    .fetch_all(&amp;pool).await?;\n\nfor article in &amp;articles {\n    \u002F\u002F استعلام منفصل لكل مقالة!\n    let tags = sqlx::query_as::&lt;_, Tag&gt;(\n        \"SELECT t.* FROM tags t JOIN article_tags at ON t.id = at.tag_id WHERE at.article_id = $1\"\n    )\n    .bind(article.id)\n    .fetch_all(&amp;pool).await?;\n}\n\n\u002F\u002F جيد: استعلام واحد مع JOIN\nlet results = sqlx::query_as::&lt;_, ArticleWithTags&gt;(\n    \"SELECT a.*, array_agg(t.name) as tags FROM articles a \n     LEFT JOIN article_tags at ON a.id = at.article_id\n     LEFT JOIN tags t ON t.id = at.tag_id\n     GROUP BY a.id\"\n)\n.fetch_all(&amp;pool).await?;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">الفهارس المفقودة\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-sql\">-- استعلام بطيء بدون فهرس\nEXPLAIN ANALYZE SELECT * FROM articles WHERE slug = 'my-article';\n-- Seq Scan: 500ms\n\n-- إضافة فهرس\nCREATE INDEX idx_articles_slug ON articles(slug);\n\n-- بعد الفهرس\nEXPLAIN ANALYZE SELECT * FROM articles WHERE slug = 'my-article';\n-- Index Scan: 0.5ms\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">تجميع الاتصالات\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">let pool = PgPoolOptions::new()\n    .max_connections(50)\n    .min_connections(5)\n    .acquire_timeout(Duration::from_secs(5))\n    .idle_timeout(Duration::from_secs(300))\n    .connect(&amp;database_url)\n    .await?;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">أدوات التشخيص\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>EXPLAIN ANALYZE\u003C\u002Fstrong> — خطة تنفيذ الاستعلام\u003C\u002Fli>\n\u003Cli>\u003Cstrong>pg_stat_statements\u003C\u002Fstrong> — إحصائيات الاستعلامات\u003C\u002Fli>\n\u003Cli>\u003Cstrong>pgBadger\u003C\u002Fstrong> — تحليل سجلات PostgreSQL\u003C\u002Fli>\n\u003Cli>\u003Cstrong>tracing مع sqlx\u003C\u002Fstrong> — تسجيل كل استعلام مع المدة\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>تصحيح أداء قاعدة البيانات يبدأ بالقياس. EXPLAIN ANALYZE لكل استعلام بطيء، فهارس للأعمدة المستخدمة في WHERE وJOIN، وتجنب مشكلة N+1 باستخدام JOIN.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.805321Z","تصحيح الأداء — عندما تقتل قراءات قاعدة البيانات زمن الاستجابة","تشخيص أداء قاعدة البيانات: مشكلة N+1، الفهارس، تجميع الاتصالات، تحسين الاستعلامات.","Rust أداء PostgreSQL",null,"index, follow",[22,27,31],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000022","Performance","performance","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000005","PostgreSQL","postgresql",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust","الهندسة",[37,43,49],{"id":38,"title":39,"slug":40,"excerpt":41,"locale":12,"category_name":35,"published_at":42},"d0000000-0000-0000-0000-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","2026-03-28T10:44:50.120618Z",{"id":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":35,"published_at":48},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":35,"published_at":54},"d0000000-0000-0000-0000-000000000684","التحول الرقمي في Indonesia بقيمة 29 مليار دولار: فرص لشركات البرمجيات","attahawwul-arraqami-indonesia-29-milyar-dular-furas-sharikat-albarmajiyat","من المتوقع أن يصل سوق خدمات تكنولوجيا المعلومات في Indonesia إلى 29.03 مليار دولار في 2026، ارتفاعاً من 24.37 مليار دولار في 2025. البنية التحتية السحابية والذكاء الاصطناعي والتجارة الإلكترونية ومراكز البيانات تقود أسرع نمو في جنوب شرق آسيا.","2026-03-28T10:44:50.092728Z",{"id":13,"name":56,"slug":57,"bio":58,"photo_url":19,"linkedin":19,"role":59,"created_at":60,"updated_at":60},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]