mysql,2个字段比较条件,能建立索引吗

发布于 2022-09-13 00:02:41 字数 278 浏览 42 评论 0

业务场景:需要把项目的数据,同步到其他业务方(一旦新增或修改,都需要同步)。故涉及到2个字段,last_update_time,sync_time;

语句展示 select * from try_report where last_update_time > sync_time

我已经尝试建立了last_update_time ,last_update_time 的联合索引,但结果是无效的,
所以我想,大概是因为这个判断条件都是变量,所以是不是不能建立索引,或者有别的方法可以实现方法,可以建立索引呢。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

呢古 2022-09-20 00:02:41
CREATE TABLE `dev` (
  `id` int(11) NOT NULL,
  `last_update_time` datetime DEFAULT NULL,
  `sync_time` datetime DEFAULT NULL,
  `virt` tinyint(1) GENERATED ALWAYS AS (`last_update_time` > `sync_time`) STORED,
  PRIMARY KEY (`id`),
  KEY `virt` (`virt`),
  KEY `cmp` (`last_update_time`,`sync_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
EXPLAIN select id from dev force index(cmp) where last_update_time > sync_time;
EXPLAIN select id from dev force index(virt) where virt=1;
EXPLAIN select id from dev where last_update_time > sync_time;
EXPLAIN select id from dev where virt=1;
EXPLAIN select * from dev where last_update_time > sync_time;
EXPLAIN select * from dev where virt=1;

其实六个explain跑一下就能看出问题来。。。主要问题不在于索引,在于 select *
如果一次性的量特别多建议先取id再取数据。。。

缱倦旧时光 2022-09-20 00:02:41

范围查询是可能会走索引的。
走不走索引完全取决与你需要返回的数据量,和 > 这个条件 < 的反向执行成本.
MySQL的优化器回计算正反面执行计划的成本,再选择最优的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文