Mysql like不走索引实现方法

流程图

flowchart TD
    A(开始) --> B(创建表)
    B --> C(插入数据)
    C --> D(创建索引)
    D --> E(查询数据)
    E --> F(使用like不走索引)
    F --> G(使用正则表达式)
    G --> H(查询数据)
    H --> I(结束)

步骤及代码实现

1. 创建表

首先,我们需要创建一张表来演示这个问题。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_index` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

上面的代码创建了一个名为users的表,表中包含两个字段:idnameid是主键,name字段我们将会使用它来演示like不走索引的问题。

2. 插入数据

接下来,我们需要向表中插入一些数据。

INSERT INTO `users` (`name`) VALUES ('John'), ('Michael'), ('Robert'), ('David'), ('William'), ('James');

上面的代码向users表中插入了6条数据。

3. 创建索引

为了验证like不走索引的问题,我们需要在name字段上创建一个索引。

ALTER TABLE `users` ADD INDEX `name_index` (`name`);

上面的代码创建了一个名为name_index的索引,该索引会加快我们对name字段的模糊查询操作。

4. 查询数据(未使用like)

首先,我们来验证一下正常情况下使用like走索引的查询。

EXPLAIN SELECT * FROM `users` WHERE `name` LIKE 'John%';

上面的代码使用了EXPLAIN关键字来查看查询的执行计划,LIKE操作符后的'John%'表示模糊匹配以John开头的名字。

执行以上代码后,你会发现查询结果中的type列为ref,表示该查询会使用索引。

5. 使用like不走索引

接下来,我们尝试使用like但不走索引的查询。

EXPLAIN SELECT * FROM `users` WHERE `name` LIKE '%o%';

上面的代码使用LIKE操作符后的'%o%'表示模糊匹配包含字母o的名字。

执行以上代码后,你会发现查询结果中的type列为ALL,表示该查询不会使用索引。

6. 使用正则表达式

为了解决like不走索引的问题,我们可以使用正则表达式来替代like操作。

EXPLAIN SELECT * FROM `users` WHERE `name` REGEXP 'o';

上面的代码使用了REGEXP关键字并指定了一个正则表达式'o',表示匹配包含字母o的名字。

执行以上代码后,你会发现查询结果中的type列为ref,表示该查询会使用索引。

7. 查询数据(使用正则表达式)

最后,我们来验证一下使用正则表达式进行查询的结果。

SELECT * FROM `users` WHERE `name` REGEXP 'o';

上面的代码会返回包含字母o的名字。

至此,我们已经完成了如何实现mysql like不走索引的教学。

序列图

sequenceDiagram
    participant 小白
    participant 开发者
    小白->>开发者: 请问怎么实现“mysql like不走索引”?
    开发者->>小白: 首先,你需要创建一张表,然后插入数据...
    小白->>开发者: 好的,我明白了
    开发者->>小白: 然后,你需要在其中一个字段上创建索引...
    小白->>开发者: 好的,我已经创建了索引
    开发者->>小