はじめに
エアークローゼット アドベントカレンダー8日目の記事です。
最近、データベースのパフォーマンスが遅いと感じている方への一助になれば嬉しいです。
インデックスとは
データベースのインデックスは、テーブル内のデータを効率的に検索・取得するためによく使用していると思います。
主な目的はこちらが挙げられます。
- クエリの高速化
- データの並び替えの効率化
- 一意性の保証
MysqlのInnoDBではインデックスにB+Treeを採用していますが、その仕様については今回は触れず、インデックスが効いていない主なパターンと簡単な改善策について挙げますので参考にしてみてください。
インデックスが効かない
where句にORを使用している
改善策:簡単な方法はUNIONをORの代わりにUNIONを使用する
-- 悪い例
SELECT * FROM users WHERE department = 'Marketing' OR status = 'Active';
-- 改善策
SELECT * FROM users WHERE department = 'Marketing'
UNION
SELECT * FROM users WHERE status = 'Active';
検索時のデータタイプとテーブルカラムのデータタイプが異なる
改善策:データタイプを合わせる
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT NOT NULL
);
-- 悪い例
SELECT * FROM orders WHERE customer_id = '12345';
-- 改善策
SELECT * FROM orders WHERE customer_id = 12345;
検索時のデータタイプとテーブルカラムのデータタイプが異なる
改善策:データタイプを合わせる
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT NOT NULL
);
-- 悪い例
SELECT * FROM orders WHERE customer_id = '12345';
-- 改善策
SELECT * FROM orders WHERE customer_id = 12345;
データを変更する関数を使用する(YEARやMONTHなど)
改善策:関数を使用しないクエリにする
-- 悪い例
SELECT * FROM users WHERE YEAR(birth_date) = 1990;
-- 改善策
SELECT * FROM users WHERE birth_date BETWEEN '1990-01-01' AND '1990-12-31';
LIKEで後方一致、部分一致の検索をする
改善策:前方一致で検索する
-- 悪い例
SELECT * FROM users WHERE username LIKE '%tanaka';
-- 改善策
SELECT * FROM users WHERE username LIKE 'tanaka%';
最後に
本記事をご覧いただきありがとうございます。
エアークローゼット Advent Calendar 2024はまだまだ続きますので、他のエンジニア、PMの記事もご覧ください。
また、エアークロゼットでは採用活動も行っておりますので、興味のある方はこちらのリンクまで!!