我有一百万行的数据库并不是很多。它们都按城市排序,并带有city_id(已编入索引)。我想用最新的帖子显示:
SELECT * FROM table FORCE INDEX(PRIMARY, city_id) WHERE city_id=1 ORDER BY 'id' DESC LIMIT 0,4
id也标记为主要。在添加力量指数之前,需要5.9秒。我在SO上找到了解决方案并且效果很好。查询现在需要0.02秒。
问题是,当我将该城市改为2或3或其他任何东西时,这似乎只适用于city_id 1。
我不确定mysql是如何工作的。它是否在频繁查询时索引更好,或者我在这里遗漏了什么。
答案 0 :(得分:0)
对你的查询做一个解释(有和没有力量):
explain SELECT * FROM table WHERE city_id=1 ORDER BY 'id' DESC LIMIT 0,4
并查看mysql告诉您使用某个索引的成本。关于你的索引策略和你的力量:MySQL喜欢组合索引,并且通常不太善于将它们自身组合,并且主索引总是 on ,所以不需要指定它。关于你的陈述,我会使用类似的东西,看看它是否能提高性能:
select * from table use index(city_id) where city_id=1 ORDER BY 'id'
DESC LIMIT 0,4
并且始终牢记:在cmdline上多次测量语句的时间总是让缓存启动,因此它非常无用(如果将city_id更改为其他值,也许这就是导致性能不佳的原因)。
您会在MySQL Performance Blog找到很多好的提示和效果提示。