[MySQLインデックス]ファジークエリインデックスを無効にしない方法、およびフィールドが両側に%を追加できるようにする方法

ファジークエリを使用してSQLにインデックスを追加する場合、フィールドの左側または両側ではなく、フィールドの右側に追加する必要があります。そうすると、すべてが無効になるため、両側に追加するにはどうすればよいでしょうか。

最初の例:
次の図はデータベーステーブルです

CREATE TABLE `tbl_user`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`age`INT(11) DEFAULT NULL,
`email` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('1aa1',21,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('2bb2',23,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('3cc3',24,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('4dd4',26,'[email protected]');

名前フィールドと年齢フィールドにインデックスを追加します。

CREATE INDEX idx_user_nameAge ON tbl_user(NAME,age)

次に、 explain を使用してテストします。
テスト1:クエリ*

EXPLAIN SELECT * FROM tbl_user WHERE NAME LIKE '%aa%';

ここに画像の説明を挿入
テスト2:カバーインデックス

EXPLAIN SELECT id,NAME,age FROM tbl_user WHERE NAME LIKE '%aa%';

ここに画像の説明を挿入
ここでは、インデックスが無効ではなく、上記の3つのフィールドの一部を使用しても無効にならないことがわかります。
テスト3:他のフィールドを追加します。ここでは、電子メールにインデックスを追加しませんでした。

EXPLAIN SELECT id,NAME,age,email FROM tbl_user WHERE NAME LIKE '%aa%';

ここに画像の説明を挿入
インデックスが無効であることがわかります

したがって、ファジークエリを解決するには、両側に%を追加し、インデックスが無効ではない場合、クエリ時にインデックスをカバーする必要があります。つまり、上記のテスト2のように、クエリが必要なフィールドにインデックスを追加してから、カバーリングインデックスを使用しても、インデックスが無効になることはありません。

おすすめ

転載: blog.csdn.net/Pzzzz_wwy/article/details/106600213