对具有一个键值的两列进行索引
index on two columns with one key value
我有一个 table 有两个时间字段(和其他字段):dateX 和 dateY。
我希望能够对行进行排序,以便如果 dateX 不为空,我们使用该行的 dateX 进行排序,如果 dateX 为空,我们使用该行的 dateY 进行排序。
有没有一种方法可以优化架构、为这些列编制索引等,以便通过添加一个由两个日期组合而成的列(如果 dateX != null : 日期 X ? 日期 Y )?
您可以使用 MySQL 的 IFNULL()
函数:
ORDER BY IFNULL(dateX, dateY)
但是,请注意,这样的排序操作不会受益于您在 table 上定义的任何索引,因此可能会很慢。
索引可以帮助进行这种排序的唯一方法是,如您所建议的那样,您对 table 进行非规范化并将此操作的预先计算结果存储在其自己的(索引)列中。如果需要,您可以定义 BEFORE INSERT
和 BEFORE UPDATE
triggers 以确保此类列与基础数据保持一致:
CREATE TRIGGER myTable_bi BEFORE INSERT ON myTable FOR EACH ROW
SET NEW.dateCombined = IFNULL(NEW.dateX, NEW.dateY);
CREATE TRIGGER myTable_bu BEFORE UPDATE ON myTable FOR EACH ROW
SET NEW.dateCombined = IFNULL(NEW.dateX, NEW.dateY);
我有一个 table 有两个时间字段(和其他字段):dateX 和 dateY。
我希望能够对行进行排序,以便如果 dateX 不为空,我们使用该行的 dateX 进行排序,如果 dateX 为空,我们使用该行的 dateY 进行排序。
有没有一种方法可以优化架构、为这些列编制索引等,以便通过添加一个由两个日期组合而成的列(如果 dateX != null : 日期 X ? 日期 Y )?
您可以使用 MySQL 的 IFNULL()
函数:
ORDER BY IFNULL(dateX, dateY)
但是,请注意,这样的排序操作不会受益于您在 table 上定义的任何索引,因此可能会很慢。
索引可以帮助进行这种排序的唯一方法是,如您所建议的那样,您对 table 进行非规范化并将此操作的预先计算结果存储在其自己的(索引)列中。如果需要,您可以定义 BEFORE INSERT
和 BEFORE UPDATE
triggers 以确保此类列与基础数据保持一致:
CREATE TRIGGER myTable_bi BEFORE INSERT ON myTable FOR EACH ROW
SET NEW.dateCombined = IFNULL(NEW.dateX, NEW.dateY);
CREATE TRIGGER myTable_bu BEFORE UPDATE ON myTable FOR EACH ROW
SET NEW.dateCombined = IFNULL(NEW.dateX, NEW.dateY);