返回

MySQL 使用 like "%x",真的会走全表吗?

后端

MySQL模糊匹配(Like "%x")的神秘面纱:索引失效还是优化帮手?

当使用MySQL中的Like "%x"模糊匹配时,是否一定会导致索引失效,一直是一个热议的话题。一些人认为,只要使用Like "%x",索引就会失效,导致查询进行全表扫描。然而,事实并非如此。

索引失效的条件

索引失效是指MySQL在执行查询时,没有使用索引来优化查询性能,而是直接扫描整张表来获取数据。索引失效通常发生在以下几种情况下:

  • 索引列上使用了不等于(=)或不等号(<,>,<=,>=)比较运算符。
  • 索引列上使用了函数或表达式。
  • 查询使用了Like "%x"模糊匹配。
  • 索引列上使用了IS NULL或IS NOT NULL比较运算符。

Like "%x"模糊匹配是否一定会导致索引失效?

Like "%x"模糊匹配是否会导致索引失效,关键在于表中的字段。如果表中的字段只有主键+二级索引,那么即使使用了左模糊匹配,也不会进行全表扫描(type=all),而是进行索引扫描(type=range)。

这是因为,MySQL在执行Like "%x"模糊匹配时,会将模糊匹配模式转换为一个范围查询。例如,Like "%x"会被转换为>= "x" AND < "y"。然后,MySQL会使用二级索引来查找满足此范围查询的数据。

示例

以下是一个示例,展示了Like "%x"模糊匹配不会导致索引失效的情况:

CREATE TABLE `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `name_index` (`name`)
);

INSERT INTO `table1` (`id`, `name`) VALUES
(1, 'John Doe'),
(2, 'Jane Smith'),
(3, 'Michael Jones'),
(4, 'Mary Johnson'),
(5, 'Robert Brown');

如果我们对该表执行以下查询:

SELECT * FROM `table1` WHERE `name` LIKE "%o%";

MySQL会使用name_index索引来查找满足此范围查询的数据。查询结果如下:

+----+-------+
| id | name  |
+----+-------+
| 1 | John Doe |
| 3 | Michael Jones |
+----+-------+

如你所见,即使使用了Like "%o%"模糊匹配,MySQL也没有进行全表扫描,而是使用了索引来优化查询性能。

结论

综上所述,我们可以得出结论,MySQL使用Like "%x"模糊匹配并不一定会导致索引失效。索引失效与否,关键在于表中的字段和查询的具体条件。

常见问题解答

  1. 为什么Like "%x"模糊匹配不会总会导致索引失效?

    • 因为MySQL会将模糊匹配模式转换为一个范围查询,并使用二级索引来查找满足此范围查询的数据。
  2. 在哪些情况下,Like "%x"模糊匹配会导致索引失效?

    • 当表中只有主键没有二级索引时,Like "%x"模糊匹配会导致索引失效。
  3. 如何避免Like "%x"模糊匹配导致索引失效?

    • 确保表中存在二级索引。
  4. 除了使用二级索引,还有什么方法可以优化模糊匹配查询?

    • 使用LIKE"x%"右模糊匹配,或者使用FULLTEXT索引。
  5. 如何判断查询是否使用了索引?

    • 使用EXPLAIN命令来查看查询的执行计划,其中type字段表示查询类型(如ALL、RANGE、INDEX)。