0

私は、非常に反復的な2つのクエリの下にあるWebサイトを実行しています。また、MySQL innoDB プロセスでは、プロセスに多くの時間がかかっていることがわかります。プロセスが存在する場合は常に、一時テーブルを作成し続け、多くのメモリと CPU を消費して実行に時間がかかります。

それらは本当に悪かったので、どうにかしてこれらを最適化することができました..しかし、それ以上のことはできません。

$getmoddetails =    "SELECT a.id, a.name, a.defvar, a.description, a.icon, a.thumb, a.average_rating, a.total_rating, c.rating, a.group_access, d.long_name, a.editor_id, e.users_count
        FROM dir_cat_item AS b
        INNER JOIN dir_item AS a ON a.id = b.item_id
        AND a.status = 'O'
        LEFT JOIN dir_item_notation_user_map AS c ON a.id = c.item_id
        AND c.user_id =%u 
        LEFT JOIN users AS d ON d.id = a.editor_id
        LEFT JOIN (SELECT item_id, COUNT(*) AS users_count
            FROM   module
            GROUP BY item_id) AS e ON e.item_id = b.item_id
        WHERE a.id=%u";


$getnbModules_by_col = "SELECT 
                            posx,COUNT(posx) as nb 
                        FROM module WHERE 
                            user_id = %u 
                            AND profile_id = %u 
                        GROUP BY posx
                        ORDER BY posx ASC";

モジュールのテーブル インデックス

- item_id
- ユーザーID
- profile_id
- ユニーク

USERS テーブルの場合

- ID
- ユーザー名

何か提案をお願いします...

アップデート :-

CREATE TABLE IF NOT EXISTS `module` (
  `item_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
  `profile_id` int(3) unsigned NOT NULL DEFAULT '0',
  `posx` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `posy` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `posj` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `x` smallint(5) unsigned NOT NULL DEFAULT '0',
  `y` smallint(5) unsigned NOT NULL DEFAULT '0',
  `typ` char(1) CHARACTER SET utf8 NOT NULL DEFAULT 'D',
  `variables` text COLLATE utf8_unicode_ci,
  `uniq` smallint(5) unsigned NOT NULL DEFAULT '1',
  `blocked` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `minimized` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `old_id` tinyint(3) unsigned DEFAULT NULL,
  `feed_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `shared` varchar(33) COLLATE utf8_unicode_ci DEFAULT NULL,
  `currentview` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  KEY `item_id` (`item_id`,`user_id`,`profile_id`,`uniq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

item_id 18  A   No  
user_id 393467  A   No
profile_id  393467  A   No
uniq    393467  A   No

前もって感謝します

4

1 に答える 1

0

moduleその 2 番目のクエリで最高のパフォーマンスを得るには、テーブルに適切なインデックスが必要です。

...  ON module (user_id, profile_id, posx)

module最初のクエリでは、テーブルに別のインデックスを使用することでメリットが得られる可能性があります。

... ON module (item_id)

しかし、テーブルの定義、データ型、列のカーディナリティがなければ、決定的な提案を行うことは実際には不可能です。

最初のクエリでは、インライン ビュー (派生テーブル) に としてエイリアスを付けた述語を追加することをお勧めしますe。MySQL が述語を外側のクエリからインライン ビューにプッシュしているとは思いません。

    ( SELECT item_id
           , COUNT(*) AS users_count
        FROM module
       WHERE item_id = %u
       GROUP BY item_id
    ) AS e

外側のクエリの WHERE 句で指定するのと同じ値をその WHERE 句で指定する必要があります。私が読んでいるものから...

e.item_id = b.item_id = a.id = %u

そのインライン ビューにその WHERE 句を追加すると、モジュール テーブルから取得される行数が削減され、その派生テーブルには 1 つの行しかありません。先頭の列が のインデックスはitem_id、カバリング インデックスになります。EXPLAIN PLAN が表示されますが、表示Using indexされませんUsing filesort


最初のクエリが比較的少数の行をプルバックしている場合、最初のクエリで派生テーブル (エイリアスとしてe) への結合の代わりに、モジュール テーブルに対する相関サブクエリを検討することができます (大きな派生テーブルのマテリアライズを避けるため)。 )。(ただし、一般に、相関サブクエリは実際にパフォーマンスを低下させる可能性があります。ただし、場合によっては、外部クエリが少数の行を引き戻す場合、サブクエリを繰り返し実行すると、大きな派生テーブルを生成するよりも実際にパフォーマンスが向上することがあります。から数行だけ必要です。)

SELECT a.id
     , a.name
     , a.defvar
     , a.description
     , a.icon
     , a.thumb
     , a.average_rating
     , a.total_rating
     , c.rating
     , a.group_access
     , d.long_name
     , a.editor_id
     , ( SELECT SUM(1)
           FROM module e
          WHERE e.item_id = b.item_id
            AND e.item_id = %u
       ) AS users_count
  FROM dir_cat_item b
  JOIN dir_item a 
    ON a.id = b.item_id
   AND b.item_id = %u 
   AND a.status = 'O'
  LEFT
  JOIN dir_item_notation_user_map c 
    ON c.item_id = a.id
   AND c.item_id = %u
   AND c.user_id = %u
  LEFT
  JOIN users d
    ON d.id = a.editor_id
 WHERE a.id = %u
于 2013-11-03T03:24:12.600 に答える