| Bug #34753 | Optimizer doesn't see Index on text field. | ||
|---|---|---|---|
| Submitted: | 21 Feb 2008 23:28 | Modified: | 22 Feb 2008 4:28 |
| Reporter: | Eugene Turkestanov | Email Updates: | |
| Status: | Can't repeat | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
| Version: | 5.0.22 | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
[21 Feb 2008 23:28]
Eugene Turkestanov
[22 Feb 2008 4:28]
Valeriy Kravchuk
Thank you for a problem report. I was not able to repeat the behaviour described with a newer 5.0.x version:
C:\Program Files\MySQL\MySQL Server 5.1\bin>mysql -uroot -proot -P3308 test
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.54-enterprise-gpl-nt-log MySQL Enterprise Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> CREATE TABLE S (
-> id int(11) NOT NULL auto_increment,
-> sl text collate latin1_general_cs NOT NULL,
-> ic int(11) NOT NULL default '0',
-> sl_c int(11) NOT NULL default '0',
-> PRIMARY KEY (id),
-> UNIQUE KEY sl (sl(255), ic, sl_c)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Query OK, 0 rows affected (0.53 sec)
mysql> CREATE TABLE R (
-> id bigint(20) NOT NULL auto_increment,
-> path varchar(200) collate latin1_general_cs NOT NULL default '',
-> au varchar(100) collate latin1_general_cs default NULL,
-> PRIMARY KEY (id),
-> UNIQUE KEY path (path)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Query OK, 0 rows affected (0.08 sec)
mysql> insert into R values (1, 'something1', 'value1');
Query OK, 1 row affected (0.05 sec)
mysql> insert into R values (2, 'something2', 'value2');
Query OK, 1 row affected (0.03 sec)
mysql> insert into R values (3, 'nothing', 'value3');
Query OK, 1 row affected (0.03 sec)
mysql> insert into S values (1, 'value2', 1, 1);
Query OK, 1 row affected (0.39 sec)
mysql> insert into S values (2, 'irrelevant', 2, 2);
Query OK, 1 row affected (0.03 sec)
mysql> insert into S values (3, 'irrelevant again', 3, 3);
Query OK, 1 row affected (0.03 sec)
mysql> select * from R r
-> where r.path like 'something%'
-> and not exists (select 1 from S s where s.sl = r.au);
+----+------------+--------+
| id | path | au |
+----+------------+--------+
| 1 | something1 | value1 |
+----+------------+--------+
1 row in set (0.05 sec)
mysql> explain select * from R r
-> where r.path like 'something%'
-> and not exists (select 1 from S s where s.sl = r.au)\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: r
type: range
possible_keys: path
key: path
key_len: 202
ref: NULL
rows: 1
Extra: Using where
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: s
type: ref
possible_keys: sl
key: sl
key_len: 257
ref: test.r.au
rows: 1
Extra: Using where
2 rows in set (0.00 sec)
So, as you can see, index on sl is used. Please, try with the newer version, 5.0.51a, and in case of the same problem provide a more detailed explanation on how to repeat.
