mysql - 具有一个键值的两列索引

标签 mysql sql indexing

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

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

是否有一种方法可以优化架构,为这些列建立索引等,以便可以通过添加两个日期组合的列(if dateX != null : dateX)来有效地完成此操作,而无需对行进行反规范化? 日期Y )?

最佳答案

您可以使用 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);

关于mysql - 具有一个键值的两列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373897/

相关文章:

sql - 编写 T-SQL 查询来查找所有至少连续出现 3 次的数字

引号中的python 2.7循环索引

sql - 索引连接查询的 View ?

javascript - 在 Node.js 中索引嵌套的 JSON

mysql - 将 6 个项目加在一起得出总数,但不要将它们的值加在一起

php - 当我尝试有条件地插入或更新时,我在我的 Laravel 应用程序中遇到了竞争条件,有什么建议......?

sql - 避免在SQL的自反关系中重复记录

php - php中mysql查询结果为null时如何打印

javascript - php 访问 mqsql 或 html 访问 json 或 html 访问 xml ?哪个更快?

sql - 减去时间戳