there is an unique key index 'pathref_2 (pathref,version)' on this table.

so why does 'explain select * from files where (pathref,version)=(129286,0);' scan the whole table?

I can rewrite the query, but for reasons out of my control I have to design a query which takes single value for a pathref, as demonstrated in the first query.

Can anyone shed some light on this?


CREATE TABLE files (
  id int(11) NOT NULL auto_increment,
  pathref int(11) NOT NULL default '0',
  version int(11) NOT NULL default '0',
  mdate bigint(20) default NULL,
  ddate datetime default NULL,
  size bigint(20) default NULL,
  md5 varchar(32) default NULL,
  PRIMARY KEY  (id),
  UNIQUE KEY pathref_2 (pathref,version),
  KEY pathref (pathref),
  KEY version (version),
  KEY mdate (mdate),
  CONSTRAINT files_ibfk_1 FOREIGN KEY (pathref) REFERENCES paths (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql> select count(*) from files;
+----------+
| count(*) |
+----------+
|   117079 |
+----------+
1 row in set (0.07 sec)

mysql> explain select * from files where (version,pathref)=(select 
max(version),pathref from files where pathref=129286 group by pathref);
+----+-------------+-------+------+-------------------+-----------+---------+-------+--------+--------------------------+
| id | select_type | table | type | possible_keys     | key       | key_len | 
ref   | rows   | Extra                    |
+----+-------------+-------+------+-------------------+-----------+---------+-------+--------+--------------------------+
|  1 | PRIMARY     | files | ALL  | NULL              | NULL      |    NULL | 
NULL  | 117299 | Using where              |
|  2 | SUBQUERY    | files | ref  | pathref_2,pathref | pathref_2 |       4 | 
const |      1 | Using where; Using index |
+----+-------------+-------+------+-------------------+-----------+---------+-------+--------+--------------------------+
2 rows in set (0.00 sec)

mysql> show index from files;
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | 
Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| files |          0 | PRIMARY   |            1 | id          | A         |     
 117299 |     NULL | NULL   |      | BTREE      |         |
| files |          0 | pathref_2 |            1 | pathref     | A         |     
 117299 |     NULL | NULL   |      | BTREE      |         |
| files |          0 | pathref_2 |            2 | version     | A         |     
 117299 |     NULL | NULL   |      | BTREE      |         |
| files |          1 | pathref   |            1 | pathref     | A         |     
 117299 |     NULL | NULL   |      | BTREE      |         |
| files |          1 | version   |            1 | version     | A         |     
 117299 |     NULL | NULL   |      | BTREE      |         |
| files |          1 | mdate     |            1 | mdate       | A         |     
 117299 |     NULL | NULL   | YES  | BTREE      |         |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
6 rows in set (0.21 sec)

mysql> explain select pathref,max(version) from files where pathref=129286 group by pathref;
+----+-------------+-------+------+-------------------+-----------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys     | key       | key_len | 
ref   | rows | Extra                    |
+----+-------------+-------+------+-------------------+-----------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | files | ref  | pathref_2,pathref | pathref_2 |       4 | 
const |    1 | Using where; Using index |
+----+-------------+-------+------+-------------------+-----------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)

mysql> select pathref,max(version) from files where pathref=129286 group by 
pathref;
+---------+--------------+
| pathref | max(version) |
+---------+--------------+
|  129286 |            0 |
+---------+--------------+
1 row in set (0.00 sec)

mysql> explain select * from files where (pathref,version)=(129286,0);
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | 
rows   | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | files | ALL  | NULL          | NULL |    NULL | NULL | 
117299 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
1 row in set (0.01 sec)

mysql> explain select * from files where pathref=129286 AND version=0;
+----+-------------+-------+-------+---------------------------+-----------+---------+-------------+------+-------+
| id | select_type | table | type  | possible_keys             | key       | 
key_len | ref         | rows | Extra |
+----+-------------+-------+-------+---------------------------+-----------+---------+-------------+------+-------+
|  1 | SIMPLE      | files | const | pathref_2,pathref,version | pathref_2 |    
   8 | const,const |    1 |       |
+----+-------------+-------+-------+---------------------------+-----------+---------+-------------+------+-------+
1 row in set (0.00 sec)

--
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-                                                               -
- Jason Pyeron                      PD Inc. http://www.pdinc.us -
- Partner & Sr. Manager             7 West 24th Street #100     -
- +1 (443) 921-0381                 Baltimore, Maryland 21218   -
-                                                               -
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

This message is for the designated recipient only and may contain privileged, proprietary, or otherwise private information. If you have received it in error, purge the message from your system and notify the sender immediately. Any other use of the email by you is prohibited.

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to