首页 > 解决方案 > 在通配符 LIKE 子句之前执行简单的 where 子句吗?

问题描述

这里相当简单(我希望如此)。

我想知道MySQL是否足够聪明WHERE,可以在不能使用索引的通配符子句之前优化/运行简单子句,例如WHERE LIKE '%abc%'

例如,考虑下表:

CREATE TABLE `users` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `organization_id` bigint unsigned NOT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `users_name_index` (`name`),
  KEY `users_organization_id_foreign` (`organization_id`),
  CONSTRAINT `users_organization_id_foreign` FOREIGN KEY (`organization_id`) REFERENCES `organizations` (`id`) ON DELETE CASCADE
)

并考虑以下查询:

SELECT * FROM `users` 
WHERE `organization_id` = 1
AND `name` LIKE '%abc%'

name我知道 MySQL由于通配符前缀而无法使用索引。但是,MySQL 可以使用外键organization_id来过滤结果。

所以,问题是,MySQL 是否足够聪明,可以用organization_idof获取用户1,然后在结果数据集上执行通配符查找?或者,反之亦然(MySQL 将首先执行通配符搜索,然后将这些结果限制为带有organization_idof 的记录1

更新

这是EXPLAIN计划的结果:

在此处输入图像描述

标签: mysql

解决方案


MySQL(实际上是任何数据库)将使用索引来获取行,然后处理附加where条件(被and编辑)。

如果 上没有索引organization_id,那么您不知道先执行哪个。许多数据库尝试根据比较的复杂性优化 where 条件,但这是基于内部指标,可能不适用于所有情况。


推荐阅读