2016-01-26 7 views
10

MySQL 5.1サーバーで約20秒で実行されるクエリがありますが、MariaDB 5.5サーバーでは約15分かかります。 key_buffer_sizeやtmp_table_size、max_heap_table_sizeなどの通常の疑いのあるものはすべて同じ(128M)です。Mariadb 5.5がMySQL 5.1より遅い

旧サーバー(MySQLの5.1)

:唯一の違いは説明FASEである

SELECT products.id, 
concat(publications.company_name,' [',publications.quote,'] ', products.name) as n, 
products.impressions, 
products.contacts, 
is_channel, 
sl.i, 
count(*) 
FROM products 
LEFT JOIN publications ON products.publications_id = publications.id 
LEFT OUTER JOIN ( 
    SELECT adspace.id AS i, 
    slots.products_id FROM adspace 
    LEFT JOIN slots ON adspace.slots_id = slots.id 
     AND adspace.end > '2016-01-25 10:28:49' 
     WHERE adspace.active = 1) AS sl 
    ON sl.products_id = products.id 
WHERE 1 = 1 
AND publications.active=1 
GROUP BY products.id 
ORDER BY n ASC; 

:ほとんどの設定は

クエリ(、query_cacheなど)私が見ることができる限り等しく

+----+-------------+--------------+--------+---------------+---------+---------+-----------------------------------------+--------+---------------------------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref          | rows | Extra       | 
+----+-------------+--------------+--------+---------------+---------+---------+-----------------------------------------+--------+---------------------------------+ 
| 1 | PRIMARY  | products  | ALL | NULL   | NULL | NULL | NULL         | 6568 | Using temporary; Using filesort | 
| 1 | PRIMARY  | publications | eq_ref | PRIMARY  | PRIMARY | 4  | db.products.publications_id |  1 | Using where         | 
| 1 | PRIMARY  | <derived2> | ALL | NULL   | NULL | NULL | NULL         | 94478 |         | 
| 2 | DERIVED  | adspace  | ALL | NULL   | NULL | NULL | NULL         | 101454 | Using where      | 
| 2 | DERIVED  | slots  | eq_ref | PRIMARY  | PRIMARY | 4  | db.adspace.slots_id   |  1 |            | 
+----+-------------+--------------+--------+---------------+---------+---------+-----------------------------------------+--------+---------------------------------+ 

新サーバー(MariaDB 5.5)

+------+-------------+--------------+--------+---------------+---------+---------+-----------------------------------------+--------+---------------------------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref          | rows | Extra       | 
+------+-------------+--------------+--------+---------------+---------+---------+-----------------------------------------+--------+---------------------------------+ 
| 1 | SIMPLE  | products  | ALL | test_idx  | NULL | NULL | NULL         | 6557 | Using temporary; Using filesort | 
| 1 | SIMPLE  | publications | eq_ref | PRIMARY  | PRIMARY | 4  | db.products.publications_id |  1 | Using where         | 
| 1 | SIMPLE  | adspace  | ALL | NULL   | NULL | NULL | NULL         | 100938 | Using where      | 
| 1 | SIMPLE  | slots  | eq_ref | PRIMARY  | PRIMARY | 4  | db.adspace.slots_id   |  1 | Using where         | 
+------+-------------+--------------+--------+---------------+---------+---------+-----------------------------------------+--------+---------------------------------+ 

新しいサーバーの製品表に索引が追加され、処理速度が向上しました。

エンジン変数:

旧サーバー:

mysql> show variables like '%engine%'; 
+---------------------------+--------+ 
| Variable_name    | Value | 
+---------------------------+--------+ 
| engine_condition_pushdown | ON  | 
| storage_engine   | MyISAM | 
+---------------------------+--------+ 

mysql> show variables like '%buffer_pool%'; 
+-------------------------+---------+ 
| Variable_name   | Value | 
+-------------------------+---------+ 
| innodb_buffer_pool_size | 8388608 | 
+-------------------------+---------+ 

新サーバー:

MariaDB [db]> show variables like '%engine%'; 
+---------------------------+--------+ 
| Variable_name    | Value | 
+---------------------------+--------+ 
| default_storage_engine | InnoDB | 
| engine_condition_pushdown | OFF | 
| storage_engine   | InnoDB | 
+---------------------------+--------+ 


MariaDB [db]> show variables like '%buffer_pool%'; 
+---------------------------------------+-----------+ 
| Variable_name       | Value  | 
+---------------------------------------+-----------+ 
| innodb_blocking_buffer_pool_restore | OFF  | 
| innodb_buffer_pool_instances   | 1   | 
| innodb_buffer_pool_populate   | OFF  | 
| innodb_buffer_pool_restore_at_startup | 0   | 
| innodb_buffer_pool_shm_checksum  | ON  | 
| innodb_buffer_pool_shm_key   | 0   | 
| innodb_buffer_pool_size    | 134217728 | 
+---------------------------------------+-----------+ 

クエリで使用されるすべてのテーブルがMyISAMテーブル(新旧両方のサーバー)

ですプロファイリングでは、古いクエリが 'tmpテーブルへのコピー'で約16秒を費やし、新しいクエリこの頃は約800秒ぐらい消えてしまった。

新しいサーバーにはすべてストレージ用のSSDディスクがあり、古いサーバーには通常のディスクがあります。

を編集します。私もMySQL 5.5サーバーを使用しており、クエリには約10秒しかかかりません。私が見る限り、同じ設定をしています。

私はテーブルにそれをまとめてみました:

Location:  Customer     Own      Customer 
MySQL Type:  MySQL      MySQL     MariaDB 
Mysql Version: 5.1.56-community-log  5.5.39-1-log (Debian) 5.5.44-MariaDB-log 
HDD:   Normal      Normal     SSD 
Type:   Virtual      Real     Virtual 
Query time:  ~15s      ~10s     ~15min 
DB engine:  MyISAM      InnoDB     InnoDB 
Table Engine: MyISAM      MyISAM     MyISAM 

私、(それはいくつかの作業を使用することができますが)私は、クエリを書き直す必要はありませんが、私は2台のマシン間の違いを見つけたいです推測はMariaDBでは理想的ではない設定ですが、私はそれを見つけることができません。

+0

両方のデータベースで同じテーブルエンジンを使用してもよろしいですか? – Mjh

+0

おそらくそれはあなたの質問に答えます:完全に異なるストレージエンジン... – hendrik

+0

正しいことを理解すれば、データベースレベルのエンジンはテーブルレベルのエンジンが同じであっても差を生みますか? – darkownage

答えて

4

上記の説明から、Derived Table Merge Optimizationが使用されていることがわかります。残念なことに、あなたのケースでは、adspace以上の1つのフルテーブルスキャンだけではなく、約6kが実行されます。

考えられる解決策は、set optimizer_switch='derived_merge=off';を発行してクエリの前に最適化を無効にすることです。下位互換性のある代替方法では、副問合せにGROUP BY adspace.id, slots.products_idを追加します(結果が変更されない場合は、結合されたすべての表のPKをグループ化することが最も安全です)。

これについては、optimizer bugと報告されているものがあります。

+0

derived_merge = OFFの設定は、クエリを〜15分から〜0.3秒に移動させました。小さなスピード増加:) – darkownage

+0

@ darkownage - 私はあなたのコメントで混乱しています - それは有意な_decrease_でしたか?または_increase_? –

+0

@RickJames - 奇妙な文には申し訳ありません:)クエリは約15分から0.5秒になりました。だから、スピードアップは巨大でした。私たちはこの「最適化」をブロックすることを選択しました。クエリはそれが仕事であり、最も簡単な修正でした。あなたの質問に答えてほしいと思っています:) – darkownage

1

これは答えではないかもしれませんが、MariaDB 5.5では異なるアルゴリズムを使用して結合を実行します。私が知っている限り、MariaDB 5.5 Batch Key Access Joinが紹介されました。古いバージョンのMySQLまたはMariaDBは、別のバージョンを使用します。 ほとんどの場合、新しいバージョンが高速になるはずですが、古いテーブルを使用して特定のテーブルのパフォーマンスが向上する可能性があります。

編集:この回答は、別のストレージエンジンを使用していると述べたように、ごめんなさい。

関連する問題