-1

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

3 回答 3

0

首先,如果我没记错的话,聚集索引比非聚集索引更快。然后有时即使您在表上有索引,也尝试创建重新索引或创建统计信息以重建它。

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

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

于 2013-11-27T03:31:34.483 回答
0

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

您可以进一步阅读这篇关于优化查询的文章。

于 2013-10-03T01:49:43.080 回答
-1

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

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

于 2013-10-03T01:40:21.527 回答