On 7/4/07, Dan Nelson <[EMAIL PROTECTED]> wrote:

In the last episode (Jul 04), David T. Ashley said:
>  On 7/4/07, gary <[EMAIL PROTECTED]> wrote:
> > SELECT column FROM table WHERE column LIKE "CAT\_%";
>
>  Would it be reasonable to assume that if "column" is indexed, the
>  query would execute quickly, i.e. I would assume that the indexing
>  would facilitate this kind of query?

Yes, but only for prefix checks like in this example.  ` LIKE "%CAT%" '
or ` LIKE "%CAT" ' can't use an index.


Thanks.  I was able to confirm the behavior by creating a table with three
identical varchars, populating them randomly with a string of 6 digits but
setting each varchar within a row the same, and executing queries.

s3 is indexed (below).  "LIKE CAT%" was obscenely fast on an indexed
column.  "LIKE %CAT%" was obscenely slow.

Thanks for the help.

---------

mysql> explain stest;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a     | bigint(20)   |      | PRI | 0       |       |
| s1    | varchar(200) | YES  |     | NULL    |       |
| s2    | varchar(200) | YES  |     | NULL    |       |
| s3    | varchar(200) | YES  | MUL | NULL    |       |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> select count(*) from stest;
+----------+
| count(*) |
+----------+
|  1480131 |
+----------+
1 row in set (0.00 sec)

mysql> select * from stest where s1="123455";
+--------+--------+--------+--------+
| a      | s1     | s2     | s3     |
+--------+--------+--------+--------+
| 246823 | 123455 | 123455 | 123455 |
+--------+--------+--------+--------+
1 row in set (2.16 sec)

mysql> select * from stest where s3="123455";
+--------+--------+--------+--------+
| a      | s1     | s2     | s3     |
+--------+--------+--------+--------+
| 246823 | 123455 | 123455 | 123455 |
+--------+--------+--------+--------+
1 row in set (0.00 sec)

mysql> select count(*) from stest where s1 like "0000%";
+----------+
| count(*) |
+----------+
|      136 |
+----------+
1 row in set (2.10 sec)

mysql> select count(*) from stest where s3 like "0000%";
+----------+
| count(*) |
+----------+
|      136 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from stest where s1 like "%000%";
+----------+
| count(*) |
+----------+
|     5585 |
+----------+
1 row in set (2.19 sec)

mysql> select count(*) from stest where s3 like "%000%";
+----------+
| count(*) |
+----------+
|     5585 |
+----------+
1 row in set (2.78 sec)

Reply via email to