MySQL インデックス障害のいくつかの状況とコード例
はじめに:
MySQL データベースでは、インデックスはクエリのパフォーマンスを向上させる重要な要素の 1 つです。ただし、インデックスが期待した役割を果たさず、クエリのパフォーマンスが改善されず、さらにはクエリの速度が遅くなる場合もあります。原因は、インデックスが無効である可能性があります。この記事では、MySQL インデックスの失敗を引き起こすいくつかの一般的な状況を紹介し、対応するコード例を示します。
1. 関数または式を使用してインデックス列に対して操作を実行する
クエリ ステートメント内のインデックス列に対して関数呼び出しまたは式操作を実行すると、インデックスが無効になり、MySQL は使用できなくなります。高速処理のためのインデックスです。お問い合わせください。以下に例を示します。
-- 创建表 CREATE TABLE `user_address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 查询示例,索引失效 SELECT * FROM `user_address` WHERE YEAR(`address`) = 2022;
上記のコードでは、address
カラムに YEAR
関数を使用しているため、MySQL はインデックス ## を使用できません。 #idx_user_id、インデックスが失敗し、クエリ効率が低下します。
インデックス列で関数を使用すると、次の例のようにインデックスのエラーも発生します:
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE LEFT(`address`, 5) = 'China';
列では LEFT
関数が使用されており、これにより MySQL がインデックス idx_user_id
を使用できなくなり、インデックスが失敗します。 3. ファジー クエリに LIKE 演算子を使用する
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE `address` LIKE 'Shanghai%';
を使用できず、クエリのパフォーマンスが低下します。 4. クエリ条件で OR キーワードを使用する
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE `user_id` = 1 OR `address` = 'Shanghai';
と address
にそれぞれ独自のインデックスがありますが、2 つの条件は次のように接続されています。 OR キーワードがそれぞれ異なるインデックスが使用されているため、インデックスが無効になります。 概要:
参考資料:
(注: 上記の例のテーブル構造とクエリ ステートメントは、デモ、実際の状況はデータベースのバージョン、インデックス設定などの要因により異なる場合があります)
以上がMySQL インデックス障害の原因となる状況の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。