索引varchar的前缀

时间:2014-09-02 11:43:30

标签: mysql performance indexing varchar prefix

我有一个包含此列的2000万条记录表: category_value varchar(4000)。

我在这个专栏上也有一个索引,但结果仍然不好:

mysql> select count(*) from daniel_table where category_value like 'giraffe%'; 
+----------+ 
| count(*) | 
+----------+ 
| 107130 | 
+----------+ 
1 row in set (2 min 4.33 sec) 

所以我做了什么,创造了一个新的领域 - Short_value varchar(32) 其中包含 - Substr(category_value,1,32) 当然还有索引。

现在,当我搜索这个字段时更好:

mysql> select count(*) from daniel_table where short_value like 'giraffe%'; 
+----------+ 
| count(*) | 
+----------+ 
| 107130 | 
+----------+ 
1 row in set (1.36 sec) 

但是,我不想创建一个新字段,它是重复的。

我尝试在原始varchar(4000)上创建此索引: key cat32(category_value(32))

得到了这个结果:

mysql> select count(*) from daniel_table use index (cat32) where Category_Value like 'giraffe%' ;
+----------+
| count(*) |
+----------+
|   107130 |
+----------+
1 row in set (24.60 sec)

与varchar(32)字段相比,性能仍然不佳。 在研究这一点时,我已经找到了问题所在。 正如您在解释中所看到的,没有"使用索引"在额外的领域。 意思是,Mysql为它找到的每一行获取表。 它为什么这样做? 如何避免?

解释:

+----+-------------+--------------------------------+-------+---------------+-------+---------+------+--------+-------------+
| id | select_type | table                          | type  | possible_keys | key   | key_len | ref  | rows   | Extra       |
+----+-------------+--------------------------------+-------+---------------+-------+---------+------+--------+-------------+
|  1 | SIMPLE      | daniel_table                   | range | cat32         | cat32 | 34      | NULL | 195824 | Using where |
+----+-------------+--------------------------------+-------+---------------+-------+---------+------+--------+-------------+

非常感谢!!

0 个答案:

没有答案