Hello All,

I've bumped into a problem and can't figure out how to solve it.
If anyone has a spare minute to give me a hint on what's wrong
I'd apreciate it a lot!

The problem is that when I add 'use index (<multi-part index>)'
to my queries, MySQL doesn't always use the whole key,
but decides what left-most part of the key to use itself.
Sometimes its decisions are rather strange to me.

Here are some tests that show what I mean:


CREATE TABLE test3 (
  pr mediumint(8) unsigned NOT NULL default '0',
  a mediumint(8) unsigned default '0',
  b mediumint(8) unsigned default '0',
  data mediumint(8) unsigned default '0',
  KEY a (a),
  KEY b (b),
  KEY k (a,b)
);

INSERT INTO test3 VALUES (1,0,0,9);
INSERT INTO test3 VALUES (2,0,1,9);
INSERT INTO test3 VALUES (3,1,0,9);
INSERT INTO test3 VALUES (4,1,1,9);
INSERT INTO test3 VALUES (5,1,2,9);
INSERT INTO test3 VALUES (6,0,0,9);



Test 1
======
explain select R.data from test3 as R, test3 as L use index (k)  where
L.a=IF(R.a=0,1,0) and
L.b>R.b;

##### The result is OK (just what I expected):
+-------+-------+---------------+------+---------+------+------+------------
-------------+
| table | type  | possible_keys | key  | key_len | ref  | rows | Extra
|
+-------+-------+---------------+------+---------+------+------+------------
-------------+
| R     | ALL   | b             | NULL |    NULL | NULL |    6 |
|
| L     | index | a,b,k         | k    |       8 | NULL |    6 | where used;
Using index |
+-------+-------+---------------+------+---------+------+------+------------
-------------+


Test 2
======
explain select R.data from test3 as R, test3 as L use index (k)  where
((L.a=0 and R.a=1) or (L.a=1 and R.a=0)) and
L.b>R.b;

##### Why doesn't MySQL use the whole k index (8 bytes)?
+-------+-------+---------------+------+---------+------+------+------------
-------------+
| table | type  | possible_keys | key  | key_len | ref  | rows | Extra
|
+-------+-------+---------------+------+---------+------+------+------------
-------------+
| R     | ALL   | a,b,k         | NULL |    NULL | NULL |    6 | where used
|
| L     | range | a,b,k         | k    |       4 | NULL |    5 | where used;
Using index |
+-------+-------+---------------+------+---------+------+------+------------
-------------+


Test 3
======
explain select R.data from test3 as R, test3 as L use index (k)  where
L.a>R.a and
L.b>R.b;

##### k key isn't choosen by MySQL. Why?
+-------+------+---------------+------+---------+------+------+-------------
---------------------------------+
| table | type | possible_keys | key  | key_len | ref  | rows | Extra
|
+-------+------+---------------+------+---------+------+------+-------------
---------------------------------+
| R     | ALL  | a,b,k         | NULL |    NULL | NULL |    6 |
|
| L     | ALL  | k             | NULL |    NULL | NULL |    6 | range
checked for each record (index map: 4) |
+-------+------+---------------+------+---------+------+------+-------------
---------------------------------+


Test 4
======
explain select R.data from test3 as R, test3 as L use index (k)  where
R.a=0 and
L.a=0 and
L.b>R.b;

##### Why doesn't MySQL use the whole k index (8 bytes)?
+-------+------+---------------+------+---------+-------+------+------------
-------------+
| table | type | possible_keys | key  | key_len | ref   | rows | Extra
|
+-------+------+---------------+------+---------+-------+------+------------
-------------+
| R     | ref  | a,b,k         | a    |       4 | const |    2 | where used
|
| L     | ref  | a,b,k         | k    |       4 | const |    2 | where used;
Using index |
+-------+------+---------------+------+---------+-------+------+------------
-------------+


The bottom line is that I'd like to know if MySQL has a feature that
makes it use a key even if the optimizer doesn't think it'a good one.

Thanks in advance.

Regards,
Alexander Paperno.



---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <mysql-unsubscribe-##L=##[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to