0

这个问题与这个有关。

我有一个具有以下结构的页表:

CREATE TABLE  mydatabase.page (
  pageid int(10) unsigned NOT NULL auto_increment,
  sourceid int(10) unsigned default NULL,
  number int(10) unsigned default NULL,
  data mediumtext,
  processed int(10) unsigned default NULL,
  PRIMARY KEY  (pageid),
  KEY sourceid (sourceid)
) ENGINE=MyISAM AUTO_INCREMENT=9768 DEFAULT CHARSET=latin1;

数据列包含每条记录大小约为 80KB - 200KB 的文本。数据列中存储的数据总大小约为 1.5GB。

执行此查询需要0.08秒:

select pageid from page

但执行此查询大约需要130.0秒:

select sourceid from page

如您所见,我在 page.pageid 上有一个主索引,在 page.sourceid 上有一个索引。那么第二个查询应该花那么长时间吗?

编辑#1

解释返回

id select_type table type  possible_keys key      key_len ref rows Extra
1  SIMPLE      page  index               sourceid 5           9767 Using index

很抱歉,分析不起作用... MySQL(其 4.1.22)无法识别 SHOW PROFILE 查询。

显示索引返回

Table Non_unique Key_name  Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
page  0          PRIMARY   1            pageid      A         9767                             BTREE 
page  1          sourceid  1            sourceid    A         3255                        YES  BTREE 
4

3 回答 3

1

您是否尝试强制使用索引?像:

SELECT sourceid FROM page USE INDEX (sourceid_index)

像 sgehrig 注释一样,使用 EXPLAIN 检查是否使用了索引?并分享结果?

EXPLAIN select sourceid from page

它还可以帮助共享索引的定义:

SHOW INDEX FROM page
于 2009-05-11T09:28:59.053 回答
0

您的 sourceid 字段有何不同?如果与行数相比,您只有几个不同的 sourceid 值,那么您可以尝试增加索引的大小。

于 2009-05-11T08:18:39.417 回答
0

由于 MySQL 4.1.22 相当旧(2006 年 11 月 2 日),我怀疑它不支持覆盖辅助键索引的概念。EXPLAIN表明查询实际上使用了索引,所以我假设需要额外的时间来读取所有结果行(而不是在使用覆盖索引时只返回索引内容)来提取sourceid列。

您是否有可能在更新的 MySQL 服务器版本上检查查询?

于 2009-05-11T12:12:18.417 回答