Optimize Inner Join With WHERE BETWEEN dates
Is there a way to optimize the query more efficiently? Or do what I'm trying to do a better way? The goal is to find users that have records with overlapping ClockIn-ClockOut ranges. This is a corner stone of a new feature. I suppose the performance is not horrible at around 3 seconds but this just a small sample. The query could be run over hundreds of users when generating certain reporting.
Any suggestions are appreciated!
EXAMPLE:
SELECT a.UserID
FROM records AS a INNER JOIN records AS b
WHERE a.UserID = b.UserID
AND a.TimeClass = b.TimeClass
AND a.RecordID != b.RecordID
AND a.ClockIn <> b.ClockOut
AND a.ClockOut <> b.ClockIn
AND ( a.ClockIn BETWEEN b.ClockIn AND b.ClockOut
OR a.ClockOut BETWEEN b.ClockIn AND b.ClockOut
)
AND a.UserID IN (1,37491,74806,73680,13179,13220)
AND b.UserID IN (1,37491,74806,73680,13179,13220)
EXPLAIN:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: range
possible_keys: ix_accrualsum,idx_recordalerts,idx_payroll_elligible,idx_overlappcheck,idx_hourlyreport,idx_hourlyreport3
key: idx_overlappcheck
key_len: 4
ref: NULL
rows: 3766
Extra: Using where; Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ref
possible_keys: ix_accrualsum,idx_recordalerts,idx_payroll_elligible,idx_overlappcheck,idx_hourlyreport,idx_hourlyreport3
key: idx_overlappcheck
key_len: 5
ref: _beta.a.UserID,_beta.a.TimeClass
rows: 82
Extra: Using where; Using index
INDEXES:
*************************** 1. row ***************************
Table: records
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: RecordID
Collation: A
Cardinality: 8617349
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: records
Non_unique: 1
Key_name: ix_accrualsum
Seq_in_index: 1
Column_name: TimeClass
Collation: A
Cardinality: 17
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 3. row ***************************
Table: records
Non_unique: 1
Key_name: ix_accrualsum
Seq_in_index: 2
Column_name: Approved
Collation: A
Cardinality: 1536
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 4. row ***************************
Table: records
Non_unique: 1
Key_name: idx_xhours
Seq_in_index: 1
Column_name: Paid
Collation: A
Cardinality: 17
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 5. row ***************************
Table: records
Non_unique: 1
Key_name: idx_xhours
Seq_in_index: 2
Column_name: TimeClass
Collation: A
Cardinality: 17
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 6. row ***************************
Table: records
Non_unique: 1
Key_name: idx_xhours
Seq_in_index: 3
Column_name: UserID
Collation: A
Cardinality: 331436
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 7. row ***************************
Table: records
Non_unique: 1
Key_name: idx_recordalerts
Seq_in_index: 1
Column_name: UserID
Collation: A
Cardinality: 22267
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 8. row ***************************
Table: records
Non_unique: 1
Key_name: idx_recordalerts
Seq_in_index: 2
Column_name: Approved
Collation: A
Cardinality: 37143
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 9. row ***************************
Table: records
Non_unique: 1
Key_name: idx_recordalerts
Seq_in_index: 3
Column_name: Paid
Collation: A
Cardinality: 44649
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 10. row ***************************
Table: records
Non_unique: 1
Key_name: idx_projectid
Seq_in_index: 1
Column_name: ProjectID
Collation: A
Cardinality: 2086
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 11. row ***************************
Table: records
Non_unique: 1
Key_name: idx_payroll_elligible
Seq_in_index: 1
Column_name: UserID
Collation: A
Cardinality: 47089
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 12. row ***************************
Table: records
Non_unique: 1
Key_name: idx_payroll_elligible
Seq_in_index: 2
Column_name: Paid
Collation: A
Cardinality: 62900
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 13. row ***************************
Table: records
Non_unique: 1
Key_name: idx_payroll_elligible
Seq_in_index: 3
Column_name: TimeClass
Collation: A
Cardinality: 103823
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 14. row ***************************
Table: records
Non_unique: 1
Key_name: idx_payroll_elligible
Seq_in_index: 4
Column_name: ClockIn
Collation: A
Cardinality: 8617349
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 15. row ***************************
Table: records
Non_unique: 1
Key_name: idx_overlappcheck
Seq_in_index: 1
Column_name: UserID
Collation: A
Cardinality: 92659
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 16. row ***************************
Table: records
Non_unique: 1
Key_name: idx_overlappcheck
Seq_in_index: 2
Column_name: TimeClass
Collation: A
Cardinality: 105089
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 17. row ***************************
Table: records
Non_unique: 1
Key_name: idx_overlappcheck
Seq_in_index: 3
Column_name: RecordID
Collation: A
Cardinality: 8617349
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 18. row ***************************
Table: records
Non_unique: 1
Key_name: idx_overlappcheck
Seq_in_index: 4
Column_name: ClockIn
Collation: A
Cardinality: 8617349
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 19. row ***************************
Table: records
Non_unique: 1
Key_name: idx_overlappcheck
Seq_in_index: 5
Column_name: ClockOut
Collation: A
Cardinality: 8617349
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 20. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport
Seq_in_index: 1
Column_name: UserID
Collation: A
Cardinality: 269292
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 21. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport
Seq_in_index: 2
Column_name: AccountCodeID
Collation: A
Cardinality: 359056
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 22. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport
Seq_in_index: 3
Column_name: TimeClass
Collation: A
Cardinality: 430867
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 23. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport
Seq_in_index: 4
Column_name: Signed
Collation: A
Cardinality: 453544
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 24. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport
Seq_in_index: 5
Column_name: Approved
Collation: A
Cardinality: 574489
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 25. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport
Seq_in_index: 6
Column_name: Paid
Collation: A
Cardinality: 718112
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 26. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport_acct
Seq_in_index: 1
Column_name: AccountCodeID
Collation: A
Cardinality: 74287
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 27. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport_acct
Seq_in_index: 2
Column_name: TimeClass
Collation: A
Cardinality: 94696
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 28. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport_acct
Seq_in_index: 3
Column_name: Signed
Collation: A
Cardinality: 94696
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 29. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport_acct
Seq_in_index: 4
Column_name: Approved
Collation: A
Cardinality: 116450
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 30. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport_acct
Seq_in_index: 5
Column_name: Paid
Collation: A
Cardinality: 123104
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 31. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport3
Seq_in_index: 1
Column_name: UserID
Collation: A
Cardinality: 84483
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 32. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport3
Seq_in_index: 2
Column_name: TimeClass
Collation: A
Cardinality: 126725
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 33. row ***************************
Table: records
Non_unique: 1
Key_name: idx_hourlyreport3
Seq_in_index: 3
Column_name: Paid
Collation: A
Cardinality: 165718
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment: