MySQL ยังคงลอยอยู่ (แบบสอบถามติดอยู่กับการส่งข้อมูล)


10

ฉันมีสถานการณ์ต่อไปนี้:

ประมาณ 5 ครั้งต่อสัปดาห์ (ไม่เกี่ยวข้องกับสถานการณ์ใด ๆ เช่นแคชชัดเจนปริมาณการเข้าชม) บางคำสั่งติดอยู่กับการส่งข้อมูล ( show processlist):

>     SELECT `main_table`.`entity_id`, `main_table`.`level`, `main_table`.`path`, `main_table`.`position`,
> `main_table`.`is_active`, `main_table`.`is_anchor`,
> `main_table`.`name`, `url_rewrite`.`request_path` FROM
> `catalog_category_flat_store_30` AS `main_table`
>      LEFT JOIN `core_url_rewrite` AS `url_rewrite` ON url_rewrite.category_id=main_table.entity_id AND
> url_rewrite.is_system=1 AND url_rewrite.product_id IS NULL AND
> url_rewrite.store_id='30' AND url_rewrite.id_path LIKE 'category/%'
> WHERE (path LIKE '1/2/%') AND (main_table.store_id = '30') AND
> (is_active = '1') AND (include_in_menu = '1') ORDER BY name ASC

อันที่สอง:

> SELECT `main_table`.`entity_id`, main_table.`name`, main_table.`path`,
> `main_table`.`is_active`, `main_table`.`is_anchor`,
> `main_table`.`manually`, `url_rewrite`.`request_path` FROM
> `catalog_category_flat_store_10` AS `main_table`  LEFT JOIN
> `core_url_rewrite` AS `url_rewrite` ON
> url_rewrite.category_id=main_table.entity_id AND
> url_rewrite.is_system=1 AND url_rewrite.product_id IS NULL AND
> url_rewrite.store_id='10' AND url_rewrite.id_path LIKE 'category/%'
> WHERE (main_table.is_active = '1') AND (main_table.include_in_menu =
> '1') AND (main_table.path like '1/2/1528/1569/%') AND (`level` <= 4)
> ORDER BY `main_table`.`position` ASC

ข้อความค้นหาเหล่านี้เกี่ยวข้องกับการสร้างเมนูนำทาง พวกเขาทำงานโดยไม่มีปัญหาใด ๆ และรวดเร็วมากตลอดเวลา

มีข้อสงสัยอื่น ๆ เกิดขึ้นสองสามครั้งต่อเดือนในการเก็บข้อมูลหรือรอการล็อคตาราง:

INSERT INTO `catalogsearch_result` SELECT 316598 AS `query_id`, `s`.`product_id`, MATCH (s.data_index) AGAINST ('STRING HERE' IN BOOLEAN MODE) AS `relevance` FROM `catalogsearch_fulltext` AS `s`
INNER JOIN `catalog_product_entity` AS `e` ON e.entity_id = s.product_id WHERE (s.store_id = 38) AND (MATCH (s.data_index) AGAINST ('STRING HERE' IN BOOLEAN MODE)) ON DUPLICATE KEY UPDATE `relevance` = VALUES(`relevance`)

(ค้นหาที่เกี่ยวข้อง)

ข้อมูลเพิ่มเติม:

  • core_url_rewrite - บันทึก 3M (30 เว็บไซต์, 100k ผลิตภัณฑ์)
  • catalog_category_flat_store_ * - 2000 บันทึก (เปิดใช้งานหมวดหมู่แบบเรียบ)

นี่ทำงานบนการตั้งค่าโดยใช้ vmware บนฮาร์ดแวร์ขนาดใหญ่ (mysql master มี 8 คอร์ที่จัดสรรและ 64Gb of RAM, SSD ดิสก์บนที่เก็บข้อมูล SAN), mysql ได้รับการปรับปรุงและตรวจสอบอย่างต่อเนื่อง มีปัญหาบางอย่างในอดีตที่เกี่ยวข้องกับ I / O (บางฉบับมีลิงก์ระหว่างเซิร์ฟเวอร์และที่เก็บข้อมูล SAN)

เราไม่สามารถระบุปัญหาได้เนื่องจากการทำงานบนโลหะเปลือย (ไม่มีการจำลองเสมือน, การกำหนดค่าแบบเดียวกัน) สิ่งนี้จะไม่เกิดขึ้นเลยในสภาวะที่มีความเครียดสูง (ใช้สถานการณ์การทดสอบการล้อม + โหลดการโหลดไม่มีแคช)

ใครที่มีปัญหาคล้ายกัน

UPDATE:

reindexAll การค้นหาถูกย้ายไปที่ตารางชั่วคราว (ดังนั้นจึงไม่ล็อคตารางหลักที่ใช้โดยการผลิตแล้วเปลี่ยนชื่อตาราง tmp) ดังนั้นกระบวนการทำดัชนีใหม่จะไม่รบกวนผู้เข้าชมที่ค้นหาเว็บไซต์ https://github.com/magendooro/magento-fulltext-reindexรุ่งโรจน์ไปยัง carco


คุณแน่ใจหรือว่าพวกเขาวิ่งเร็ว ทางเลือกอาจเป็นเมนูนำทางถูกแคช Afaik คือการใช้ดัชนีไม่ใช่เรื่องง่ายเพราะไม่มีดัชนีอยู่เหนือ category_ud, is_system และพา ธ และ path คือ aa LIKE ดังนั้น MySQL จึงเป็นปัญหาที่แท้จริงของ afaik ฉันไม่ส่งออกฐานข้อมูล btw ;-) เพียง 2
เซ็นต์

1
ที่เลือกทำงานในภายใต้ 1s แบบสอบถามให้ซ้อนขึ้นเมื่อคนแรกที่เข้าพักในการส่งข้อมูล ...
FlorinelChis

1
FWIW ฉันได้เห็นปัญหาเดียวกันแล้ว
philwinkle

@philwinkle การตั้งค่าการค้นหาของคุณเป็นอย่างไร ข้อความเต็ม?
FlorinelChis

1
github.com/magendooro/magento-fulltext-reindexสิ่งนี้ช่วยเราและตัดสินใจที่จะเผยแพร่ซอร์สโค้ด
FlorinelChis

คำตอบ:


4

ดูเหมือนว่าข้อบกพร่องหลัก / การถดถอยที่เราเห็นใน 1.7 ที่แคชบล็อกและคอลเลกชันไม่ทำงานอย่างมีประสิทธิภาพสำหรับเมนูนำทาง ( catalog/navigation/top.phtml)

คุณสามารถทดสอบได้โดยลบมันออกหรือเพียงแค่จับเอาท์พุทชั่วคราวลงในไฟล์ด้วยob_startและให้บริการจากสแตติกไฟล์ / memcache

นอกจากนี้ฮาร์ดแวร์ที่คุณใช้ไม่ได้ให้เสียงที่ยอดเยี่ยมและมีการระบุขนาดของร้านค้าที่คุณมี อาจมีปัญหาคอขวด I / O เช่นกัน - ที่เก็บ SAN + เครือข่ายที่แออัด = ประสิทธิภาพต่ำ

-

ในฐานะที่เป็นโซลูชั่นที่ดิบคุณสามารถปรับระดับบล็อกสำหรับการนำทาง (การถ่ายโอนข้อมูลget_class($this)) top.phtmlเพื่อระบุ

วิธีนี้จะช่วยให้การแคชทั่วทั้งไซต์โดยไม่มีการแคชระดับหมวดหมู่ที่เรียกใช้เวอร์ชันใหม่ นอกจากนี้ยังควรลบis_activeคลาสออกจาก tree renderer หากคุณทำเช่นนี้เพื่อหลีกเลี่ยงรายการเมนูแบบสุ่มที่ปรากฏขึ้นเลือก (และใช้ทางเลือก JS แทน)

public function getCacheTags()
{
  return parent::getCacheTags();
}
public function getCacheLifetime()
{
  return null;
}
public function getCacheKey()
{
  return parent::getCacheKey();
}
public function getCacheKeyInfo()
{
  $shortCacheId = array(
    'CATALOG_NAVIGATION',
    Mage::app()->getStore()->getId(),
    Mage::getDesign()->getPackageName(),
    Mage::getDesign()->getTheme('template'),
    Mage::getSingleton('customer/session')->getCustomerGroupId(),
    'template' => $this->getTemplate(),
    'name' => $this->getNameInLayout(),
  );
  $cacheId = $shortCacheId;
  $shortCacheId = array_values($shortCacheId);
  $shortCacheId = implode('|', $shortCacheId);
  $shortCacheId = md5($shortCacheId);
  $cacheId['short_cache_id'] = $shortCacheId;
  return $cacheId;
}

ก่อนหน้านี้เราจัดสรร 32 คอร์และ RAM 92Gb (และเปลี่ยนการตั้งค่า mysql ตามผลลัพธ์เดียวกัน) - เซิร์ฟเวอร์มี 64 คอร์และ 184 gb ของแรม (นั่นคือเหตุผลที่ฉันบอกว่ามันใหญ่) ... ขอโทษฉันไม่ได้เอ่ย มันคือ Magento Enterprise 1.12 เราตรวจสอบการรับส่งข้อมูลเครือข่ายไม่เห็นสิ่งใดที่ชี้ไปยังคอขวด (เรามีปัญหามาก่อนตัวเชื่อมต่อไฟเบอร์ไม่ทำงานอย่างถูกต้อง แต่ถูกแทนที่ด้วย)
FlorinelChis

Enterprise 1.12 คือ CE 1.7 - เป็นรหัสพื้นฐานเดียวกัน ดังนั้นข้อผิดพลาดจะส่งผลกระทบต่อพวกเขาทั้งสอง ลองสิ่งที่ฉันพูด (เขียนโค้ดการนำทางด้านบนสุดและปิดการใช้งานหมวดหมู่บน nav แบบเลเยอร์) และคุณสามารถยืนยันได้ ฮาร์ดแวร์เพิ่มเติมจะไม่สร้างความแตกต่างหากซอฟต์แวร์ไม่ได้ติดตั้งอย่างถูกต้องเพื่อใช้งาน
Ben Lessani - Sonassi

ฉันจะแก้ไขคำตอบของฉันและเพิ่มบางhackyรหัสสำหรับคุณที่จะใช้ในการยืนยัน
เบน Lessani - Sonassi

มันเป็นจุดเริ่มต้นที่ดีฉันจะวางบางสิ่งบางอย่างและดูว่ามันจะล่มภายใน 1 สัปดาห์หรือไม่ :)
FlorinelChis

3

แทนที่ฟังก์ชั่นที่

app / รหัส / core / Mage / แคตตาล็อก / ผู้ช่วย / ประเภท / url / Rewrite.php:

/**
* Join url rewrite to select
*
* @param Varien_Db_Select $select
* @param int $storeId
* @return Mage_Catalog_Helper_Category_Url_Rewrite
*/
public function joinTableToSelect(Varien_Db_Select $select, $storeId)
{
$select->joinLeft(
array('url_rewrite' => $this->_resource->getTableName('core/url_rewrite')),
'url_rewrite.category_id=main_table.entity_id'
);
$select->where('url_rewrite.is_system = ?', '1');
$select->where($this->_connection->quoteInto('url_rewrite.store_id = ?', (int)$storeId));
$select->where($this->_connection->prepareSqlCondition('url_rewrite.id_path', array('like' => 'category/%')));
$select->where('request_path = url_rewrite.request_path');

return $this;
}

2

ในกรณีของเรามันมาถึงการสืบค้นช้านี้

SELECT `main_table`.`entity_id`
      , `url_rewrite`.`request_path`
FROM `catalog_product_entity` AS `main_table` 
INNER JOIN `catalog_product_website` AS `w`
   ON main_table.entity_id = w.product_id 
LEFT JOIN `core_url_rewrite` AS `url_rewrite`
   ON url_rewrite.product_id = main_table.entity_id
   AND url_rewrite.is_system = 1
   AND url_rewrite.category_id IS NULL
   AND url_rewrite.store_id = 1
   AND url_rewrite.id_path LIKE 'product/%'
WHERE (w.website_id='1')

จากapp / รหัส / core / Mage / แผนผังเว็บไซต์ / รุ่น / ทรัพยากร / แคตตาล็อก / Product.php

มันค้างเนื่องจากคำสั่งcategory_id IS NULL MySQL ด้วยเหตุผลบางอย่างไม่ได้ใช้ดัชนี

การลบcategory_id IS NULLและการตั้งค่าid_path REGEXP '^ product / [0-9] + $'แก้ไขปัญหา

คัดลอกแอป / รหัส / คอร์ / Mage / แคตตาล็อก / ผู้ช่วย / ผลิตภัณฑ์ / Url / Rewrite.phpไปยังแอป / รหัส / ท้องถิ่น / Mage / แคตตาล็อก / ผู้ช่วย / ผลิตภัณฑ์ / Url / Rewrite.phpและเพิ่มฟังก์ชั่นนี้:

public function joinTableToSelectPatch(Varien_Db_Select $select, $storeId)
{ 
$select->joinLeft(
    array('url_rewrite' => $this->_resource->getTableName('core/url_rewrite')),
    'url_rewrite.product_id = main_table.entity_id AND url_rewrite.is_system = 1 AND ' .
        $this->_connection->quoteInto('url_rewrite.store_id = ? AND ',
            (int)$storeId) .
        $this->_connection->prepareSqlCondition('url_rewrite.id_path', array('regexp' => '^product/[0-9]+$')),
    array('request_path' => 'url_rewrite.request_path'));
return $this;
}

จากนั้นคัดลอกแอป / รหัส / คอร์ / ผู้วิเศษ / แผนผังไซต์ / โมเดล / ทรัพยากร / แคตตาล็อก / Product.phpไปยังแอป / รหัส / ท้องถิ่น / ผู้วิเศษ / แผนผังไซต์ / โมเดล / ทรัพยากร / แคตตาล็อก / Product.phpและเปลี่ยนบรรทัด 72 เป็น:

$urlRewrite->joinTableToSelectPatch($this->_select, $storeId);

นำมาจากhttps://www.goivvy.com/blog/solved-magento-stuck-generating-google-sitemap-large-website

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.