如何快速从大表中选择一组ID?

时间:2013-10-03 01:03:07

标签: mysql performance where-in

我有一个ID为主要的大表。大约300万行,我需要根据给定的ID列表提取一小组行。

目前我正在那里......但它很慢,比如5到10秒。

我的代码:

select id,fa,fb,fc 
from db1.t1 
where id in(15,213,156,321566,13,165,416,132163,6514361,... );

我尝试一次查询一个ID,但仍然很慢。喜欢

select id,fa,fb,fc from db1.t1 where id =25;

我还尝试使用临时表并插入ID列表并调用Join。但没有改善。

select id,fa,fb,fc from db1.t1 inner join  db1.temp  on t1.id=temp.id

有没有办法让它更快?

这是表格。

CREATE TABLE  `db1`.`t1` (
  `id` int(9) NOT NULL,
  `url` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL,
  `lastUpdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lastModified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

好的,这是解释选择。

id=1,
select_type='SIMPLE', 
table='t1', 
type='range', 
possible_keys='PRIMARY', 
key='PRIMARY',
key_len= '4',
ref= '', 
rows=9, 
extra='Using where'

3 个答案:

答案 0 :(得分:0)

以下是一些如何加快表格性能的提示:

  • 尽量避免在更新的MyISAM表上进行复杂的SELECT查询 经常,以避免由于发生表锁定的问题 读者和作家之间的争论。
  • 要根据索引对索引和数据进行排序,请使用myisamchk --sort-index --sort-records=1(假设您要对索引1进行排序)。如果您有更快的查询速度,这是一种很好的查询方式 您想要按顺序读取所有行的唯一索引 到索引。第一次以这种方式对大表进行排序时,它可能会 需要很长时间。
  • 对于频繁更改的MyISAM表,请尽量避免全部 可变长度列(VARCHARBLOBTEXT)。该表使用 动态行格式,如果它甚至包括一个可变长度 列。
  • 字符串在MyISAM中自动压缩前缀和结束空间 索引。见“CREATE INDEX Syntax”
  • 您可以通过缓存查询或答案来提高性能 应用程序然后一起执行许多插入或更新。 在此操作期间锁定表可确保索引缓存 只在所有更新后刷新一次。你也可以利用 MySQL的查询缓存实现类似的结果;见“The MySQL Query Cache”.

您可以阅读有关优化查询的文章。

答案 1 :(得分:0)

如果我没有错,首先聚簇索引比非聚簇索引快。 然后有时甚至你在表上有索引,尝试创建重新索引,或创建统计信息来重建它。

我在SQL解释计划中看到,当我们使用(...)中的ID时,它会将其转换为 其中(ID = 1)或(ID = 2)或(Id = 3).....如此大的列表更大,所以对于非常大的表避免使用IN()

尝试“解释”这个SQL,它可以告诉你实际的瓶颈在哪里。 查看此链接http://dev.mysql.com/doc/refman/5.5/en/explain.html 希望能起作用

答案 2 :(得分:-1)

看起来使用'in'的原始sql语句应该没问题,因为Id列已编入索引

我认为您基本上需要更快的计算机 - 您是否在共享主机上进行此查询?