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

Mysql 如何快速从大表中选择一组ID?,mysql,performance,where-in,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; 我还尝试使用临时表,插入I

我有一个以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'

看起来使用“in”的原始sql语句应该可以,因为Id列已被索引


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

以下是一些如何提高表性能的提示:

  • 尽量避免对已更新的MyISAM表执行复杂的SELECT查询 通常,为了避免由于 读者和作者之间的争论
  • 要根据索引对索引和数据进行排序,请使用myisamchk --排序索引——排序记录=1(假设您要按索引1排序)。如果您有一个 要从中按照顺序读取所有行的唯一索引 到索引。第一次这样对一张大桌子排序时,它可能会 要花很长时间
  • 对于经常更改的MyISAM表,请尽量避免所有更改 可变长度列(
    VARCHAR
    BLOB
    TEXT
    )。该表使用 动态行格式(如果它甚至包含单个可变长度) 专栏
  • 字符串在MyISAM中自动压缩前缀和结束空间 索引。看
  • 您可以通过在数据库中缓存查询或答案来提高性能 应用程序,然后一起执行许多插入或更新。 在此操作期间锁定表可确保索引缓存 仅在所有更新后刷新一次。你也可以利用 使用MySQL的查询缓存实现类似的结果;看
您可以进一步阅读有关优化查询的文章


首先,如果我没有错的话,聚集索引比非聚集索引更快。 然后,有时甚至您在表上有索引,尝试创建重新索引,或者创建统计数据来重建它

我在SQL解释计划中看到,当我们在(…)中使用where ID时,它会将其转换为 其中(ID=1)或(ID=2)或(ID=3)。。。。。因此,许多ors的列表越大,因此对于非常大的表,请避免使用()

尝试“解释”这个SQL,它可以告诉您实际的瓶颈在哪里。 检查此链接
希望会起作用

Hm,PK应该总是被编入索引,但从你的描述来看似乎不是。你有什么索引?它有ID作为主键。我想这意味着它被索引了。如果我错了,请纠正我。显示来自db1.t1的索引;这是InnoDB还是MyISAM?这不算什么,在您的
CREATE
语句中没有您在
PRIMARY KEY(urlId)
中提到的
urlId
列,它是i7,SSD上有16gb ram。事实上,我在开发箱上得到了这个,也在vps上进行了测试。VPS似乎稍微好一些。