Details
- 
    
Bug
 - 
    Status: Closed (View Workflow)
 - 
    
Minor
 - 
    Resolution: Won't Fix
 - 
    None
 - 
    None
 
Description
MariaDB version >= 5.5.23 does not use index condition pushdown for range query, when it should.
I have tested it with both 5.5.23 and 5.5.27. The same query when run against MySQL 5.6.6-m9 and MariaDB 5.3.5 results in index condition pushdown being used.
– Test case:
					CREATE TABLE `icp_test` (  | 
		
					`i` int(11) NOT NULL,  | 
		
					`k` int(11) NOT NULL,  | 
		
					`v` char(32) DEFAULT NULL,  | 
		
					KEY `k` (`k`,`i`)  | 
		
					) ENGINE=InnoDB DEFAULT CHARSET=latin1  | 
		
| 
					 | 
		
					SOURCE icp_test.dump
			 | 
		
| 
					 | 
		
					EXPLAIN SELECT * FROM icp_test WHERE k BETWEEN 4000 AND 5000 AND i < 1000 ORDER BY k ASC LIMIT 10\G  | 
		
The data to use with the table is attached with this bug report.
Explain output is seen on MariaDB 5.5.27:
					MariaDB [test]> explain select * from icp_test where k between 4000 and 5000 and i < 1000 order by k asc limit 10\G
			 | 
		
					*************************** 1. row ***************************
			 | 
		
					           id: 1
			 | 
		
					  select_type: SIMPLE
			 | 
		
					        table: icp_test
			 | 
		
					         type: range
			 | 
		
					possible_keys: k
			 | 
		
					          key: k
			 | 
		
					      key_len: 8
			 | 
		
					          ref: NULL
			 | 
		
					         rows: 222436
			 | 
		
					        Extra: Using where
			 | 
		
					1 row in set (0.00 sec)
			 | 
		
Explain output as seen on MySQL 5.6.6-m9:
					mysql> explain select sql_no_cache * from icp_test where k between 4000 and 5000 and i < 1000 order by k asc limit 10\G
			 | 
		
					*************************** 1. row ***************************
			 | 
		
					           id: 1
			 | 
		
					  select_type: SIMPLE
			 | 
		
					        table: icp_test
			 | 
		
					         type: range
			 | 
		
					possible_keys: k
			 | 
		
					          key: k
			 | 
		
					      key_len: 8
			 | 
		
					          ref: NULL
			 | 
		
					         rows: 222436
			 | 
		
					        Extra: Using index condition
			 | 
		
					1 row in set (0.00 sec)
			 | 
		
Explain output as seen on MariaDB 5.3.5:
					MariaDB [test]> explain select sql_no_cache * from icp_test where k between 4000 and 5000 and i < 1000 order by k asc limit 10\G
			 | 
		
					*************************** 1. row ***************************
			 | 
		
					           id: 1
			 | 
		
					  select_type: SIMPLE
			 | 
		
					        table: icp_test
			 | 
		
					         type: range
			 | 
		
					possible_keys: k
			 | 
		
					          key: k
			 | 
		
					      key_len: 8
			 | 
		
					          ref: NULL
			 | 
		
					         rows: 223490
			 | 
		
					        Extra: Using index condition
			 | 
		
					1 row in set (0.00 sec)
			 | 
		
This obviously means that the above query executes slowly on MariaDB 5.5.27. 
The query times on MariaDB 5.3.5 and MySQL 5.6.6-m9:
					+-----+------+----------------------------------+
			 | 
		
					| i   | k    | v                                |
			 | 
		
					+-----+------+----------------------------------+
			 | 
		
					| 162 | 4010 | 0fcaae4367d0090810a291111b694709 |
			 | 
		
					| 729 | 4016 | 8b52c5ceff7638e0522f7d3e23618736 |
			 | 
		
					| 370 | 4032 | 7235547a596a1db3013d872cdbc7231a |
			 | 
		
					| 707 | 4035 | 7f55c7c738ed3b56a91501c9fb59afe1 |
			 | 
		
					| 645 | 4047 | e265b948627662ac3df9dcd373933335 |
			 | 
		
					| 757 | 4051 | 9cdd8a926d21433e2af26536b078480c |
			 | 
		
					| 572 | 4100 | f3daf307a6889403313ed700e27449b0 |
			 | 
		
					|  89 | 4143 | 2cf9585a3ec980327790bd677fd97aa1 |
			 | 
		
					| 321 | 4184 | 4fbc60b0aa1ebb58864ad0bdbacf6f14 |
			 | 
		
					| 751 | 4185 | 0d47c6f6f50b78fb8b7d80d1c3e45937 |
			 | 
		
					+-----+------+----------------------------------+
			 | 
		
					10 rows in set (0.00 sec)
			 | 
		
The query time on MariaDB 5.5.27:
					+-----+------+----------------------------------+
			 | 
		
					| i   | k    | v                                |
			 | 
		
					+-----+------+----------------------------------+
			 | 
		
					| 162 | 4010 | 0fcaae4367d0090810a291111b694709 |
			 | 
		
					| 729 | 4016 | 8b52c5ceff7638e0522f7d3e23618736 |
			 | 
		
					| 370 | 4032 | 7235547a596a1db3013d872cdbc7231a |
			 | 
		
					| 707 | 4035 | 7f55c7c738ed3b56a91501c9fb59afe1 |
			 | 
		
					| 645 | 4047 | e265b948627662ac3df9dcd373933335 |
			 | 
		
					| 757 | 4051 | 9cdd8a926d21433e2af26536b078480c |
			 | 
		
					| 572 | 4100 | f3daf307a6889403313ed700e27449b0 |
			 | 
		
					|  89 | 4143 | 2cf9585a3ec980327790bd677fd97aa1 |
			 | 
		
					| 321 | 4184 | 4fbc60b0aa1ebb58864ad0bdbacf6f14 |
			 | 
		
					| 751 | 4185 | 0d47c6f6f50b78fb8b7d80d1c3e45937 |
			 | 
		
					+-----+------+----------------------------------+
			 | 
		
					10 rows in set (0.73 sec)
			 | 
		
This is because MariaDB 5.5.27 is reading more data (Handler_read_* = 19328), while MySQL 5.6.6-m9 and MariaDB 5.3.5 are reading far fewer data (Handler_read_* = 10)