CREATE TABLE `vehicle` (
`Id` char(36) NOT NULL COMMENT 'Id Guid',
`Dr` int(11) NOT NULL COMMENT '',
`OrganizationId` bigint(20) unsigned DEFAULT NULL,
`DeviceNo` varchar(20) DEFAULT NULL,
`LicensePlateNo` varchar(10) DEFAULT NULL,
`vin` varchar(50) DEFAULT NULL,
PRIMARY KEY (`Id`),
KEY `vehicle_vin_IDX` (`vin`,`Dr`,`OrganizationId`,`LicensePlateNo`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
CREATE TABLE `trip` (
`Id` char(36) NOT NULL COMMENT '记录 Id',
`Vin` varchar(50) NOT NULL COMMENT '车辆 vin',
`EndTime` datetime NOT NULL COMMENT '行程结束时间',
-- 还有其余二十个字段
PRIMARY KEY (`Id`),
KEY `trip_Vin_IDX` (`Vin`,`EndTime`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='行程数据明细';
select
v.OrganizationId, v.Vin, v.LicensePlateNo,s.* from
vehicle `v`
join trip `s` on
`s`.`Vin` = `v`.`Vin`
where
v.dr = 0
and v.OrganizationId between 10000000000000000 and 19999999999999999
order by
EndTime desc
limit 0,
10
先上 sql 语句 业务场景是车辆表大概存了几百辆车,行程跟车辆是多对一的关系,trip 表有 20w 条数据,还在持续增长。。 OrganizationId 为了兼容组织结构层级关系,上级部门能看到下级部门的数据,设计成 18 位 10 进制数字,从高位起每 2 位算一个层级,最多 9 级,查询的时候就是上面 select 语句这样
但问题是有了范围查询排序似乎就走不了索引了,现在这个查询要 10 秒左右,该怎么优化呢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.