ปรับจูน Server Joomla ฐานข้อมูล กว่า 6G เนื้อหาเว็บหลายแสนรักคอร์ด ให้เร็วแรง

แชร์ความรู้ Linux Ubuntu Web Server บทความ การ config server Linux FreeBSD Apache
การติดตั้ง XAMPP Mysql PHP ใครต้องการแชร์ความรู้เรื่องต่างๆ เหล่านี้ให้ ท่านหรืออื่น โพสที่หมวดนี้ได้

Moderator: mindphp, ผู้ดูแลกระดาน

ภาพประจำตัวสมาชิก
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
โพสต์: 42451
ลงทะเบียนเมื่อ: 22/09/2008 6:18 pm
ติดต่อ:

ปรับจูน Server Joomla ฐานข้อมูล กว่า 6G เนื้อหาเว็บหลายแสนรักคอร์ด ให้เร็วแรง

โพสต์ที่ยังไม่ได้อ่าน โดย mindphp »

ปรับจูน Server Joomla ฐานข้อมูล กว่า 6G เนื้อหาเว็บหลายแสนรักคอร์ด ให้เร็วแรง
กรณีตัวอย่างนี้ เป็นการอัพเกรด Joomla จาก Joomla 3 มาเป็น Joomla 5 เว็บไซต์เน้นเนื้อหาเป็นหลัก (หลายแสนบทความ) ใช้พื้นที่เฉพาะ ฐานข้อมูลรวม กว่า 10GB
เฉพาะ Content กว่า 6GB และไฟล์แนบรูปภาพ รวม ว่า 100GB
Joomla-optimize-before.png
Joomla-optimize-after.png
หลักการในการปรับจูนจะมี 3 อย่างหลักๆ คือ
1. เลือก Server เสปกให้เหมาะกับงบ เคสนี้ไม server ไม่ได้แรงมาก cpu core speed 2.x GHz
2. ปรับจูน ฐานข้อมูลให้เข้ากับ สเปก Server และ ข้อมูลในฐานข้อมูลของเรา
กรณีนี้ใช้ Hosting เป็น cyberpanel OS เป็น Ubuntu 22
แก้ไขไฟล์
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
ปรับเพิ่ม

โค้ด: เลือกทั้งหมด

[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 8
innodb_read_io_threads = 4
innodb_write_io_threads = 4
query_cache_size = 128M
query_cache_type = 1
query_cache_limit = 4M
sort_buffer_size = 4M
join_buffer_size = 4M
tmp_table_size = 128M
max_heap_table_size = 128M
max_connections = 200
thread_cache_size = 50
table_open_cache = 400
key_buffer_size = 32M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
Restart ฐานข้อมูล

โค้ด: เลือกทั้งหมด

sudo systemctl restart mariadb
ตรวจสอบผลที่ตั้งโดยรันคำสั่ง ใน phpMyadmin หรือ command

โค้ด: เลือกทั้งหมด

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'query_cache_size';
3. ปรับจูนและสร้าง index ที่เหมาะสมให้กับการ Query ของเรา
ตัวอย่าง
ปรับโค้ด

โค้ด: เลือกทั้งหมด

 /*
			$query->clear()
				->select('*')
				->from('#__content')
				->where($db->qn('state') . '=' . $db->q(1))
				->where($db->qn('language') . ' IN (' . $db->quote(Factory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')')
				->order('id DESC');
			$query->where($db->qn('publish_up')  . ' IS NULL OR ' . $db->qn('publish_up') .' <= '. $db->q(Factory::getDate()->toSql()))
				->where($db->qn('publish_down') . ' IS NULL OR ' . $db->qn('publish_down') .' >=  '. $db->q(Factory::getDate()->toSql()));
		
			if ($catid)
			{
				$query->where($db->qn('catid') . ' IN (' . implode(',', $catid) . ')');
			}

			if ($params->get('except_categories', false))
			{
				$query->where($db->qn('catid') . ' NOT IN (' . implode(',', $params->get('except_categories')) . ')');
			}

			$db->setQuery($query, 0, $params->get('articlelimit', 20));
             */
แก้เป็น

โค้ด: เลือกทั้งหมด

             
            // กำหนดค่าวันที่ปัจจุบันและภาษา
            $currentDate = $db->quote(Factory::getDate()->toSql());
            $languageTag = $db->quote(Factory::getLanguage()->getTag());
            $defaultLanguage = $db->quote('*');
            
            // เคลียร์ query ที่ใช้งานก่อนหน้า
            $query->clear()
                ->select('*')
                ->from($db->quoteName('#__content'))
                ->where($db->quoteName('state') . ' = 1')
                ->where($db->quoteName('language') . ' IN (' . $languageTag . ', ' . $defaultLanguage . ')')
                ->where('(' . $db->quoteName('publish_up') . ' IS NULL OR ' . $db->quoteName('publish_up') . ' <= ' . $currentDate . ')')
                ->where('(' . $db->quoteName('publish_down') . ' IS NULL OR ' . $db->quoteName('publish_down') . ' >= ' . $currentDate . ')')
                ->order($db->quoteName('id') . ' DESC');
            
            // เพิ่มเงื่อนไขของ catid ถ้ามี
            if (!empty($catid)) {
                $query->where($db->quoteName('catid') . ' IN (' . implode(',', array_map([$db, 'quote'], $catid)) . ')');
            }
            
            // เพิ่มเงื่อนไขของ except_categories ถ้ามี
            $exceptCategories = $params->get('except_categories', false);
            if ($exceptCategories) {
                $query->where($db->quoteName('catid') . ' NOT IN (' . implode(',', array_map([$db, 'quote'], $exceptCategories)) . ')');
            }
            
            // ตั้งค่า limit ของผลลัพธ์
            $limit = (int) $params->get('articlelimit', 20);
            $db->setQuery($query, 0, $limit);
ช่วยให้เร็วขึ้น จาก 1.3 เป็น 0.03s
การปรับโค้ด Query ต้องเหมาะสมกับ index ที่เราสร้างไว้ในตารางฐานข้อมูลด้วยนะครับ เคสนี้ใช้ index ของ Joomla ซื่งออกแบบไว้ดีแล้ว
ถ้าใครจะปรับโครงสร้างในการสร้าง index เพิ่มเติมสำหรับ เคสนี้ปรับได้ดังนี้

โค้ด: เลือกทั้งหมด

# สร้าง Index สำหรับคอลัมน์ที่ใช้ใน WHERE clause
CREATE INDEX idx_state_language_publish ON #_content (state, language, publish_up, publish_down, catid);
Note: ไม่จำเป็นสำหรับ Joomla 5.1

ทิ้งไว้ให้ทายว่าสเปก Server ขนาดไหน
ใครสนใจเพิ่มเติมหลังไมค์มาได้

สำหรับบทความอื่นของทางเว็บเกี่ยวกับการเขียน Query SQL ดูได้ที่นี่ viewforum.php?f=74
บทความสำหรับคนทำ Hosting WebServer ดูได้ที่นี่ /บทความ/66-server-hosting.html
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 3