WEB+DB PRESS Vol.93 SQL 高速化ガイド

WEB+DB PRESS Vol.93

WEB+DB PRESS Vol.93

MySQLを主とした話でした。
スロークエリ、EXPLAINの説明、よくある問題などの説明がされており、とても良い内容でした。
(pt-query-digest は知らなかった)
以下は個人的に気になったとこ。

mysqldumpslow

mysqldumpslow -s t mysql-slow.log

ソートオプション

項目 説明
t/at 実行時/平均実行時間
l/al ロック時間/平均ロック時間
r/ar 送信行数/平均送信行数
c カウント数順

スロークエリ改善の勘所

  • keyがNULLになっているものをなくす(EXPLAINのkey)
  • filesortをなくす
  • rowsを減らす
  • ソート条件に昇順と降順を混在させない
    マルチカラムインデックスが利用されない

filesortの補足:Extraで確認可能

Extraの値 説明
where インデックス以外を利用してレコードの絞り込みを行なっている
index インデックスだけを利用して実行している。Covering Index を利用している
filesort インデックスを利用しないクイックソートを行なっている
temporary ソート時にテンポラリテーブルを利用している

カバリングインデックス

カバリングインデックスが利用されている場合は、 EXPLAINの結果に Extra: Using index が出力される。
WEB+DB Press Vol.91 データ構造の基礎知識 が良い - rochefort’s blog

ページネーションでのOFFSET問題

OFFSET の値が大きくなると遅くなる。
大量データのページネーション実装したことないので気にしたことありませんでしたが、なるほど。

SELECT if, title, FROM articles
ORDER BY published at DESC
LIMIT 10 OFFSET 50000

対応方法は、WHERE句で絞り込む or idの降順でソート。

SELECT if, title, FROM articles
WHERE id < 最後のid
ORDER BY id DESC LIMIT 10