小编Alf*_*sch的帖子

单个查询运行 10 毫秒,使用 UNION ALL 需要 290 毫秒+(770 万条记录 MySQL DB)。如何优化?

我有一张表,用于存储教师的可用约会,允许两种插入:

  1. 每小时:可以完全自由地为每位教师每天添加无限时段(只要时段不重叠):4 月 15 日,一名教师可能在 10:00、11:00、12:00 和 16:00 拥有时段. 在选择特定的教师时间/时段后为一个人提供服务。

  2. 时间段/范围:4月15日,另一位教师可能在10:00至12:00和14:00至18:00工作。一个人按到达顺序服务,所以如果老师在 10:00 到 12:00 工作,那么在此期间到达的所有人员都将按到达顺序(本地队列)出席。

由于我必须在搜索中返回所有可用的教师,因此我需要将所有空位与到达范围的顺序保存在同一个表中。通过这种方式,我可以按 date_from ASC 排序,在搜索结果中首先显示第一个可用插槽。

当前表结构

CREATE TABLE `teacher_slots` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `teacher_id` mediumint(8) unsigned NOT NULL,
  `city_id` smallint(5) unsigned NOT NULL,
  `subject_id` smallint(5) unsigned NOT NULL,
  `date_from` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_to` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `status` tinyint(4) NOT NULL DEFAULT '0',
  `order_of_arrival` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `by_hour_idx` (`teacher_id`,`order_of_arrival`,`status`,`city_id`,`subject_id`,`date_from`), …
Run Code Online (Sandbox Code Playgroud)

mysql

9
推荐指数
1
解决办法
2万
查看次数

标签 统计

mysql ×1