我有一个包含此列的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 |
+----+-------------+--------------------------------+-------+---------------+-------+---------+------+--------+-------------+
非常感谢!!