我有一个名为user的表,总共有2000万行。表info是id, name, ctime,并且只对id进行了索引。
我想查询一下select min(id) from user where citme > 1521882950。
结果时间大约是7-10秒。
当我使用select min(id) from user查询时,结果时间大约是10ms。我认为原因是因为id是由mysql索引的。所以查询速度很快。
既然索引ctime对于表来说意义不大,我在想是否有其他方法可以在不对ctime列建立索引的情况下在不到1秒内进行查询?
在mysql dev页面上,我找到了关于indexing的解释,我不知道如何应用更大的条件。
SELECT MIN(key_part2),MAX(key_part2)
FROM tbl_name WHERE key_part1=10;发布于 2019-03-10 12:41:32
为
SELECT MIN(key_part2),MAX(key_part2)
FROM tbl_name WHERE key_part1=10;你需要
INDEX(key_part1, key_part2)你所拥有的是
SELECT MIN(key_part2) -- id
FROM tbl_name WHERE key_part1=10; -- ctime哪种需求
INDEX(ctime, id)然而,InnoDB的二级索引会自动包含PK,所以这么说仅仅是
INDEX(ctime)碰巧也有同样的效果。(我更喜欢说INDEX(ctime, id),作为对读者的一个提示,我需要这双鞋。)
“因为索引ctime对表来说意义不大”--好吧,它对那个查询是有意义的!因此,将其编入索引。
如果没有索引,将读取整个表以处理查询。
使用索引时,只需读取INDEX中的一行即可获得结果。
这就是最极端的情况(有索引与没有索引)。
同时,
select min(id) from user使用PRIMARY KEY并仅读取一行以获取答案。
“我在想,是否有其他方法可以在不到1秒的时间内进行查询,而无需对ctime列进行索引?”为什么这很重要?只需添加索引,即可处理此问题。
发布于 2019-03-07 18:23:08
我问了周围的人。似乎没有更好的方法可以在几秒钟内查询没有索引的列。就我的例子而言,mysql查询fast的最佳方式是对列ctime进行索引。
如果有更好的答案,请更新。
https://stackoverflow.com/questions/55025711
复制相似问题