Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エアークローゼットAdvent Calendar 2024

Day 8

Mysqlのインデックスが効かないパターン

Last updated at Posted at 2024-12-19

はじめに

エアークローゼット アドベントカレンダー8日目の記事です。
最近、データベースのパフォーマンスが遅いと感じている方への一助になれば嬉しいです。

インデックスとは

データベースのインデックスは、テーブル内のデータを効率的に検索・取得するためによく使用していると思います。
主な目的はこちらが挙げられます。

  1. クエリの高速化
  2. データの並び替えの効率化
  3. 一意性の保証

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の記事もご覧ください。
また、エアークロゼットでは採用活動も行っておりますので、興味のある方はこちらのリンクまで!!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address