具有一个键值的两列上的索引

时间:2015-03-31 16:39:16

标签: mysql sql indexing

我有一个包含两个时间字段(和其他字段)的表:dateX和dateY。

我希望能够对行进行排序,以便如果dateX不为null,我们使用该行的dateX进行排序,如果dateX为null,我们使用行' dateY进行排序。 / p>

有没有办法优化模式,索引这些列等,以便可以有效地完成此操作,而无需通过添加两个日期组合的列来对行进行反规范化(如果dateX!= null:dateX ?dateY)?

1 个答案:

答案 0 :(得分:2)

您可以使用MySQL的IFNULL()功能:

ORDER BY IFNULL(dateX, dateY)

但请注意,这样的排序操作不会受益于您在表上定义的任何索引 - 因此可能会很慢。

索引可以帮助这种排序的唯一方法是,如您所建议的那样,对表进行非规范化并将此操作的预先计算结果存储在其自己的(索引)列中。如果需要,您可以定义BEFORE INSERTBEFORE 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);