我需要从具有VARCHAR主键索引ID的mysql表中选择某些行。
因此我使用了一个查询(但显然是13,000个ID而不是3个)
SELECT * FROM table1 WHERE ID IN ('id1928383','id3838339','id38383')
对于大多数表来说这很好用(~0.2s),但对于某些表,查询需要更长的时间(~10-11s)。
不起作用的表唯一不同的是它们有更大的Data_length?我有什么想法可以加快慢查询的速度吗?
答案 0 :(得分:1)
需要实时查找13,000行。对于每个值,它必须:
或者,它可能正在进行表扫描以单独读取每一行并与列表进行比较。您能否提供长期运行版本的说明,以确定使用哪种方法。
如果在索引中查找值,我的猜测是大表不适合页面缓存。这导致对大多数值进行额外的读取页面命中。
最简单的解决方案是增加页面缓存的大小。您也可以尝试将所有ID放入临时表并将其连接到较大的表。执行此操作时,在临时表上构建索引会特别有用。
答案 1 :(得分:1)
您可以采取一些措施来加快此查询:
INT
列使用VARCHAR
代替ID
计算机通常使用数字比使用字符串要好得多,因此这会大大加快它的速度。
ID
添加为索引。 这将创建一个带有索引列的有序表,其中搜索和排序将更快。
如果您在PHP中使用它,我建议您使用PDO,因为它具有查询缓存系统,并且如果运行许多相同的查询,则可以显着改善结果。我想其他编程语言也有类似的机制。
对于您使用的所有软件,建议使用最新版本的原因有很多。如果我没有误会,那么在旧版本的MySQL中存在IN
的性能问题,稍后修复了几个版本,但你可能是仍然使用该版本的不幸的少数人之一。
这就像我可以提供帮助一样多,如果你需要更多帮助,你需要发布更多信息(表结构,数据库结构,编程语言等)。
答案 2 :(得分:0)
确保所有id
列都已编入索引。