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

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

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

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

阅读 4k
2 个回答
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再取数据。。。

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题