سؤال

نقوم بتشغيل خادم MySQL مع تحميل معتدل (200-300 QPs) على أجهزة قوية جدًا (HP DL360 مع 8 CORES ، وذاكرة وصول عشوائي 8 جيجابايت و RAID10). جميع الجداول هي innoDB ومجموعة البيانات النشطة تناسبها innodb_buffer_pool_size.

يتم تطبيع قاعدة البيانات الخاصة بنا ولتقليل عدد الوصلات التي نستخدمها في طرق العرض المتكسلة لتسوية مجموعة البيانات. عند إضافة البيانات على دفعات عدة مرات في اليوم ، يتم تجديد MV: S باستخدام CREATE TABLE AS SELECT بدلاً من التحديث ديناميكيًا باستخدام المشغلات المعقدة.

المشكلة هي أنه في بعض الأحيان في حين أن هذه CREATE يتم تشغيل الاستعلامات (كل منها يأخذ أي شيء من 5 إلى 50 ثانية) يبدو أن الاستعلامات الأخرى غير ذات الصلة للخادم تتخلى عن قائمة الانتظار خلف CREATE الاستعلام ، مما يؤدي إلى قاعدة بيانات غير مستجيبة.

إلى (إعادة) إنشاء MV: S نستخدم شيئًا كهذا:

BEGIN TRANSACTION;
DROP TABLE IF EXISTS TableName_TMP;
CREATE TABLE TableName_TMP ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci AS 
    SELECT about100columns, and10Expressions 
    FROM Table1 
    JOIN Table2 ON Table1.fk = Table2.pk 
    /* join up to 13 other tables */
    WHERE ((removed IS NULL OR removed = 0)) 
    ORDER BY created DESC, id ASC;
ALTER TABLE TableName_TMP ADD PRIMARY KEY(id), INDEX(created);
DROP TABLE IF EXISTS TableName;
ALTER TABLE TableName_TMP RENAME TO TableName;
COMMIT;

إن شرح الاختيار ينتج شيئًا مثل:

+----+-------------+------------------+-------------+---------------+------------+---------+------------------------------+-------+-----------------------------+
| id | select_type | table            | type        | possible_keys | key        | key_len | ref                          | rows  | Extra                       |
+----+-------------+------------------+-------------+---------------+------------+---------+    ------------------------------+-------+-----------------------------+
|  1 | SIMPLE      | Table1           | ref_or_null | removed       | removed    | 5       | const                        | 76093 | Using where; Using filesort | 
|  1 | SIMPLE      | Table2           | eq_ref      | PRIMARY       | PRIMARY    | 4       | Table1.fk1                   |     1 |                             | 
|  1 | SIMPLE      | Table3           | eq_ref      | PRIMARY       | PRIMARY    | 4       | Table1.fk2                   |     1 |                             | 
/* More of the same */
|  1 | SIMPLE      | TableN           | eq_ref      | PRIMARY       | PRIMARY    | 4        | TableM.fk                    |     1 | Using index                 | 
|  1 | SIMPLE      | TableX           | eq_ref      | PRIMARY       | PRIMARY    | 4       | TableY.fk                    |     1 |                             | 
/* More of the same */    
+----+-------------+------------------+-------------+---------------+------------+---------+------------------------------+-------+-----------------------------+

أي أفكار لماذا CREATE TABLE AS الزائد التام خادمنا وكيف يمكنني منعه؟

يعتبر،

هل كانت مفيدة؟

المحلول

قمنا بحل هذا عن طريق التبديل للتحديد في وتحميل البيانات كما هو http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/ . شكرا جزيلا لراندولف بوتر لإرسالها لنا في الاتجاه الصحيح.

نصائح أخرى

قد يكون هذا هو السبب؟

ملاحظة: يرتكب جدول Drop تلقائيًا المعاملة النشطة الحالية ، إلا إذا كنت تستخدم الكلمة الرئيسية المؤقتة.

(http://dev.mysql.com/doc/refman/5.1/en/drop-table.html)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top