テーブル結合時のクエリ最適化の差分サンプル[Aurora, MariaDB]

本番環境とローカル開発環境の環境差異(Aurora, MariaDB)でクエリの実行速度に驚くほど差が出たのでメモ
AuroraはガワはMYSQLでも中身はかなり違うとは聞いていたけど…

実行環境

Aurora: 5.6.10a
MariaDB: 5.5.52

テーブル情報(共通)

INDEXが貼られているのはPKとcolumn_Dのみ

実行クエリ

column_C=0とcolumn_C<>0のテーブルをINDEXのないcolumn_Bで自己結合し、結合に失敗したレコードを抽出
クエリ自体が酷いのはご愛嬌… 

実装したやからをしばき倒したい_:(´ཀ`」 ∠):

実行計画

Aurora

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1PRIMARYsample_tablerefidx_sample_table_column_Didx_sample_table_column_D3const67448Using where;
Using temporary;
Using filesort
1PRIMARYref122lp_main.sample_table.column_B10Using where;
Not exists;
Using index
2DERIVEDsample_tablerefidx_sample_table_column_Didx_sample_table_column_D3const67448Using where

MariaDB

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEsample_tablerefidx_sample_table_column_Didx_sample_table_column_D3const67448Using where
Using temporary
Using filesort
1SIMPLEsample_tablerefidx_sample_table_column_D,
idx_sample_table_column_B
idx_sample_table_column_B122lp_main.sample_table.column_B1Using where

実行結果

Aurora: 1.66sec
MaraDB: 120sec以上 (session kill!)

AuroraではINDEXのない結合部が分割された上、Not Existで処理されているため非常に高速化している

宮川

新人エンジニア

※記事の内容は保証はしておりません(執筆時期や実施環境により挙動が変わるものがある為)。
別途検証してご利用いただくことをおすすめいたします。