我有一个相对较大的表(5,208,387 行,400mb 数据/670mb 索引),我用来搜索的所有列都是索引。
name
并且type
是 VARCHAR(255) BTREE INDEX 并且sdate
是包含时间戳的 INTEGER 列。
我无法理解一些问题,首先这个查询很慢(5秒):
SELECT *
FROM `mytable`
WHERE `name` LIKE 'hello%my%big%text%thing%'
AND `type` LIKE '%'
ORDER BY `sdate` DESC LIMIT 3
解释以上内容:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE mytable range name name 257 NULL 5191 Using where
虽然这个速度非常快(5 毫秒):
SELECT *
FROM `mytable`
WHERE `name` LIKE 'hello.my%big%text%thing%'
AND `type` LIKE '%'
ORDER BY `sdate` DESC LIMIT 3
解释以上内容:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE mytable range name name 257 NULL 204 Using where
由于索引,扫描的行数不同是有意义的,但是拥有 5k 个索引行需要 5 秒似乎太多了。
此外,排序name
而不是sdate
使查询非常快,但我需要按时间戳排序。
我不明白的第二件事是,在将最后一列添加到索引之前,数据库的索引为 1.4GB,而不是在运行 OPTIMIZE/REPAIR 之后,大小仅为 670MB。