クエリ †
スロークエリログ †
EXPLAIN †
JOIN †
- MySQLがサポートするJOINアルゴリズムはネステッド・ループ結合のみ
- インデックスが貼られている結合条件キーに対して駆動表ではフルテーブルスキャン、内部表ではインデックスが使われる
- 駆動表は行数が少ないものを選ぶ
・駆動表と内部表の結合キーにindexが適用されるようにする
- JOINのパフォーマンス劣化においては、外部結合が問題となることが多い
- 外部結合ではLEFT JOINであれば左辺のテーブルが駆動表に固定されるため、駆動表に件数が多く増える速度も早いテーブルを指定してしまうと、前述のt1 × t2の処理コストが時間とともに増えることになる
- ただそれでも、結合がひとつで、内部表の参照にインデックスが使われている限りは、問題が表面化しにくい
- 多段結合でインデックスも使われない場合は、LEFT JOINでは結合ごとの走査行数が絞り込まれないため、非常にコストがかかるようになる
テーブル状況確認 †
- DBのテーブルのカラム情報を取得
SELECT
TABLE_NAME
, COLUMN_NAME
, COLUMN_TYPE
, IS_NULLABLE
, COLUMN_KEY
, COLUMN_DEFAULT
, EXTRA
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'DB_NAME'
;
- PRI はプライマリキーを意味し、テーブル内のレコードの一意性を強制します。NULL 値は許可されません。単一の列または複数の列を主キーとして使用できます。
- UNI キーは一意キーを表し、主キーのようにテーブル(関係)内の行(レコード)の一意性を強制し、NULL 値を持ちます。1つまたは複数の列を使用して、一意のキーを作成できます。
- MUL キーはそれらのいずれでもありません。つまり、MUL キーは主キーでも一意キーでもないインデックスです。NULL 値を許可し、その名前 MUL と同じ値が複数回出現することを許可します。
- テーブル単位のデータサイズを確認
SELECT
TABLE_NAME
, ENGINE
, TABLE_ROWS -- レコード数
, AVG_ROW_LENGTH -- 平均レコード容量
, FLOOR((DATA_LENGTH + INDEX_LENGTH) / 1024) AS SIZE -- 合計容量
, FLOOR((DATA_LENGTH) / 1024) AS DATA_SIZE -- データ容量
, FLOOR((INDEX_LENGTH) / 1024) AS INDEX_SIZE -- インデックス容量
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = DATABASE()
ORDER BY
(DATA_LENGTH + INDEX_LENGTH) DESC
;
|