mysql - 在通配符 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_id
of获取用户1
,然后在结果数据集上执行通配符查找?或者,反之亦然(MySQL 将首先执行通配符搜索,然后将这些结果限制为带有organization_id
of 的记录1
?
更新
这是EXPLAIN
计划的结果:
解决方案
MySQL(实际上是任何数据库)将使用索引来获取行,然后处理附加where
条件(被and
编辑)。
如果 上没有索引organization_id
,那么您不知道先执行哪个。许多数据库尝试根据比较的复杂性优化 where 条件,但这是基于内部指标,可能不适用于所有情况。
推荐阅读
- c++ - 使用 PCL 进行点云下采样和正态估计
- postgresql - 如何在 postgres 中手动对所有行调用触发器
- javascript - 嵌套对象文字中“this”的词法上下文
- pandas - 如何在数据框中插入新列并使用 for 循环根据某些条件将值传递给它
- flutter - 颤动的应用程序可以在未运行时在接收推送通知时运行代码吗
- azure - 如何在没有任何授权令牌的情况下使用 Azure API for FHIR Server
- sql - Oracle 数据库中的 ASCII 字符问题
- angular - 如何使用现有行将另一个患者添加到表单中?
- javascript - Vue Atlas中如何以表格形式显示数据
- javascript - 生产环境中 React Native 中的全局未处理承诺拒绝处理程序