我有一个包含两个时间字段(和其他字段)的表:dateX 和 dateY。
我希望能够对行进行排序,以便如果 dateX 不为空,我们使用该行的 dateX 进行排序,如果 dateX 为空,我们使用该行的 dateY 进行排序。
是否有一种方法可以优化架构,为这些列建立索引等,以便可以通过添加两个日期组合的列(if dateX != null : dateX)来有效地完成此操作,而无需对行进行反规范化? 日期Y )?
最佳答案
您可以使用 MySQL 的 IFNULL()
功能:
ORDER BY IFNULL(dateX, dateY)
但是,请注意,此类排序操作不会受益于您在表上定义的任何索引,因此可能会很慢。
索引可以帮助进行这种排序的唯一方法是,正如您所建议的那样,您对表进行非规范化并将此操作的预先计算结果存储在其自己的(索引)列中。如果需要,您可以定义 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);
关于mysql - 具有一个键值的两列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373897/