Bug #64998 Index on TIMESTAMP not used depending on collation_connection
| Submitted: | 16 Apr 2012 20:47 | Modified: | 25 Jun 2013 16:59 |
|---|---|---|---|
| Reporter: | Hartmut Holzgraefe | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
| Version: | 5.5.20, 5.5.24 | OS: | Linux |
| Assigned to: | CPU Architecture: | Any |
[16 Apr 2012 20:47]
Hartmut Holzgraefe
[16 Apr 2012 20:59]
Hartmut Holzgraefe
test case, run "make test"
Attachment: bug64998.tgz (application/x-compressed-tar, text), 1.18 KiB.
[17 Apr 2012 7:52]
Valeriy Kravchuk
Verified just as described: [openxs@chief mysql-test]$ ./mtr bug64998 Logging: ./mtr bug64998 120417 10:50:20 [Note] Plugin 'FEDERATED' is disabled. MySQL Version 5.5.24 Checking supported features... - skipping ndbcluster - SSL connections supported - binaries are debug compiled Collecting tests... vardir: /home/openxs/dbs/5.5/mysql-test/var Removing old var directory... Creating var directory '/home/openxs/dbs/5.5/mysql-test/var'... Installing system database... Using server port 45722 ============================================================================== TEST RESULT TIME (ms) or COMMENT -------------------------------------------------------------------------- worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009 main.bug64998 [ fail ] Test ended at 2012-04-17 10:50:30 CURRENT_TEST: main.bug64998 --- /home/openxs/dbs/5.5/mysql-test/r/bug64998.result 2012-04-17 10:50:12.157822287 +0300 +++ /home/openxs/dbs/5.5/mysql-test/r/bug64998.reject 2012-04-17 10:50:30.149298895 +0300 @@ -32,4 +32,4 @@ set collation_connection='utf8_unicode_ci'; explain select * from t1 where datum > "2012-04-11 08:52:09"; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range datum datum 4 NULL 1 Using where +1 SIMPLE t1 ALL NULL NULL NULL NULL 20 Using where mysqltest: Result content mismatch ...
[29 May 2012 21:24]
Jeremy Rumpf
Just wanted to add to this bug.
A client just recently upgraded from mysql 5.1.x to mysql 5.5.24 and we are seeing marked performance degradation. After detailed investigation we came to the same conclusion as this bug report: that differing connection collations are having a marked performance differences involving indexes on DATE and TIMESTAMP columns.
As an example:
Query:
SELECT pseudo_work.work_id AS sched_id, pseudo_work.time_in as sec_time_in, pseudo_work.time_out as sec_time_out, pseudo_work.lunch as sec_lunch, pseudo_work.break as sec_break, pseudo_work.time_worked as sec_time_worked, pseudo_work.work_date AS sched_date, pseudo_work.type, pseudo_work.phone_id AS phone_id_int, pseudo_work.location_ident, pseudo_work.program_ident, pseudo_work.manager_ident, pseudo_work.agent_id AS employee_ident, pseudo_work.gmt_time_in, pseudo_work.gmt_time_out, pseudo_work.switch AS switch_ident
FROM pseudo_work
LEFT JOIN programs ON programs.prog_id = pseudo_work.program_ident
WHERE pseudo_work.location_ident = '110' AND (pseudo_work.program_ident IN ( '22104','9433','1755','476','22105','895','475','22101','22102','897','536','474','22103','473' )) AND (programs.client_ident IN ( '101','2748' ))
AND pseudo_work.manager_ident = '153899'
AND pseudo_work.work_date >= '2012-04-24'
AND pseudo_work.work_date <= '2012-05-27'
AND pseudo_work.gmt_time_in <= '1337961599'
AND pseudo_work.gmt_time_out <= '1338220799'
AND pseudo_work.gmt_time_out >= '1335369600'
Explain 1:
mysql> set collation_connection = 'utf8_unicode_ci';
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: programs
type: range
possible_keys: PRIMARY,programs_idx1
key: PRIMARY
key_len: 4
ref: NULL
rows: 14
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: pseudo_work
type: ref
possible_keys: idx_pseudo_work_03,idx_pseudo_work_04,idx_pseudo_work_07,idx_pseudo_work_08,idx_pseudo_work_09
key: idx_pseudo_work_08
key_len: 5
ref: ccms.programs.prog_id
rows: 22950
Extra: Using where
2 rows in set (0.00 sec)
Explain 2:
mysql> set collation_connection = 'utf8_general_ci';
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: pseudo_work
type: range
possible_keys: idx_pseudo_work_02,idx_pseudo_work_03,idx_pseudo_work_04,idx_pseudo_work_07,idx_pseudo_work_08,idx_pseudo_work_09
key: idx_pseudo_work_07
key_len: 8
ref: NULL
rows: 2909
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: programs
type: eq_ref
possible_keys: PRIMARY,programs_idx1
key: PRIMARY
key_len: 4
ref: ccms.pseudo_work.program_ident
rows: 1
Extra: Using where
2 rows in set (0.00 sec)
On pseudo_work the optimizer switched from idx_pseudo_work_08 to idx_pseudo_work_07, resulting in a magnitude worse performance.
We are currently investigating switching to utf8_general_ci as a temporary workaround. I believe as utf8_unicode_ci is used in a lot of examples, the severity of this bug should be increased.
[30 May 2012 17:25]
Jeremy Rumpf
Extended Hartmut's test case to include DATE and DATETIME columns. Run "make test".
Attachment: bug64998b.tgz (application/x-compressed-tar, text), 1.71 KiB.
[30 May 2012 17:26]
Jeremy Rumpf
--- bug64998.result 2012-05-30 13:16:11.035560244 -0400 +++ bug64998.reject 2012-05-30 13:21:06.869318316 -0400 @@ -34,7 +34,7 @@ set collation_connection='utf8_unicode_ci'; explain select * from t1 where datum > "2012-04-11 08:52:09"; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range datum datum 4 NULL 1 Using where +1 SIMPLE t1 ALL NULL NULL NULL NULL 20 Using where CREATE TABLE t2 ( id INT PRIMARY KEY AUTO_INCREMENT, datum DATE, @@ -67,7 +67,7 @@ set collation_connection='utf8_unicode_ci'; explain select * from t2 where datum > "2012-04-11" AND datum < "2012-04-15"; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t2 range datum datum 4 NULL 3 Using where +1 SIMPLE t2 ALL NULL NULL NULL NULL 20 Using where CREATE TABLE t3 ( id INT PRIMARY KEY AUTO_INCREMENT, datum DATETIME, @@ -100,4 +100,4 @@ set collation_connection='utf8_unicode_ci'; explain select * from t3 where datum > "2012-04-11 08:52:09"; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t3 range datum datum 9 NULL 1 Using where +1 SIMPLE t3 ALL NULL NULL NULL NULL 20 Using where mysqltest: Result content mismatch
[12 Apr 2013 12:52]
MySQL Verification Team
http://bugs.mysql.com/bug.php?id=68942 marked as duplicate of this one.
[25 Jun 2013 16:59]
MySQL Verification Team
This bug is fixed in 5.6. It will NOT be fixed in 5.5, as a fix depends on the substantial amount of work invested in a WL entry that added some important infrastructure, that is missing in 5.5.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.045 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.