mysql でインデックスを使用しないクエリ状況はどれですか?

WBOY
リリース: 2023-05-29 21:19:04
転載
2914 人が閲覧しました

mysql インデックスを使用しないクエリ状況

1. インデックス列は計算に参加し、インデックスを使用しません

SELECT `username` FROM `t_user` WHERE age=20;-- 会使用索引 SELECT `username` FROM `t_user` WHERE age+10=30;-- 不会使用索引!!因为所有索引列参与了计算 SELECT `username` FROM `t_user` WHERE age=30-10;-- 会使用索引
ログイン後にコピー

2. インデックス列は関数を使用し、インデックス

-- 不会使用索引,因为使用了函数运算,原理与上面相同 SELECT username FROM t_user WHERE concat(username,'1') = 'admin1'; -- 会使用索引 SELECT username FROM t_user WHERE username = concat('admin','1');
ログイン後にコピー
## は使用できません #3. インデックス列には like ステートメントを使用し、インデックス

SELECT * FROM USER WHERE username LIKE 'mysql测试%' --走索引 SELECT * FROM USER WHERE username LIKE '%mysql测试' --不走索引 SELECT * FROM USER WHERE username LIKE '%mysql测试%' --不走索引
ログイン後にコピー

4 は使用できません。 データ型の暗黙的な変換、文字列列と文字列列間の直接比較インデックス

-- stock_code字符串类型带索引 SELECT * FROM `stock_data` WHERE stock_code = '600538' --走索引 SELECT * FROM `stock_data` WHERE stock_code = 600538 --不走索引
ログイン後にコピー

5 を使用せずに数値を取得します。1 つのフィールドにインデックスがない限り、ステートメントを変更するときにインデックスが使用されず、インデックスも使用されないため、OR 演算は避けてください。 !

-- stock_code带索引,open不带索引 SELECT * FROM `stock_data` WHERE `stock_code` = '600538' OR `open` = 6.62 -- 不走索引 -- stock_code带索引,up_down_pre带索引 SELECT * FROM `stock_data` WHERE `stock_code` = '600538' OR `up_down_pre` = 5.1 -- 走索引
ログイン後にコピー

6. where id !=2 または where id <> 2、インデックスは作成されません。

SELECT * FROM t_user WHERE username <> 'mysql测试'
ログイン後にコピー

7. null または null でない場合、インデックスは使用できません。インデックスは使用しないでください。

SELECT * FROM t_user WHERE username IS NULL -- 不走索引 SELECT * FROM t_user WHERE username IS NOT NULL -- 不走索引
ログイン後にコピー

8. インデックス列で in ステートメントが使用されており、インデックスが使用できない可能性があります。

-- stock_code数据类型为varchar SELECT * FROM `stock_data` WHERE `stock_code` IN ('600538') -- 走索引 SELECT * FROM `stock_data` WHERE `stock_code` IN ('600538','688663','688280') -- 走索引 SELECT * FROM `stock_data` WHERE `stock_code` IN (大量数据) -- 不走索引 SELECT * FROM `stock_data` WHERE `stock_code` IN (600538) -- 不走索引
ログイン後にコピー

インデックスが使用されない状況:

1。クエリ条件がない、またはクエリ条件がビジネス データベース、特に比較的大量のデータを含むテーブルにインデックスが作成されない。#提案:

1 クエリ条件としてインデックス付き列に変更します。

2 または、頻繁にクエリされる列にインデックスを付けます

2. クエリ結果セットは元のテーブルのデータの大部分です。これは

クエリ結果セットの 25% 以上である必要があります。総行数の 25% を超えると、オプティマイザは次のように認識します。インデックスを使用する必要はありません。

提案:

1 ビジネスが許可する場合は、制限制御を使用できます。

2 ビジネス上の判断に基づいて、より良い方法はありますか?これより良い書き換えソリューションがない場合は、

3 このデータを mysql に保存しないようにしてください。それをredisに入れます。

3. インデックス自体が無効であり、統計データが非現実的です

インデックスには自己維持機能があり、テーブルの内容が頻繁に変更されると、インデックスはと表示される場合があります。無効です。

計画の変更:

テーブル データをバックアップし、関連するテーブルを削除して再構築します。

4. クエリ条件では、インデックス列に対して関数を使用するか、インデックス列に対して演算を実行します。演算には (、-、*、/、! など)

変更方法:

mysql での加算、減算、乗算、除算などの計算演算の使用を減らします。

5. 暗黙的な変換によりインデックスのエラーが発生します。これは真剣に受け止める必要があります。また、開発中によくある間違いです。

インデックスによって作成されるフィールドは varchar です() ;

select * from stu where name = ‘111';走索引 select * from stu where name = 111;不走索引
ログイン後にコピー

変更方法:

研究開発と相談し、ステートメントのクエリは仕様に準拠します。

6.<>、インデックスなしでは使用できません (補助インデックス)

変更方法:

上記の方法を使用しないでください。 query を使用するか、フィルター条件としてインデックス列を選択します。

Individual >,<,in は行く場合と行かない場合があります。結果セットによって異なります。ビジネスに応じて、limit

or or in を追加してみてください。次のように変更してみてください。 Union

7.like "%" パーセント記号は先頭に配置されません

EXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘31%' 走索引 EXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘%110' 不走索引
ログイン後にコピー
変更方法:

%linux の検索要件について% クラスでは、elasticsearch を使用できます。 mongodb は、検索サービスに特化したデータベース製品です。

以上がmysql でインデックスを使用しないクエリ状況はどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!