重新讨论MySQL MyISAM表性能问题

时间:2009-05-11 08:08:49

标签: sql mysql performance query-optimization myisam

此问题与this one有关。

我有一个表,其结构如下:

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上有一个索引。那么第二个查询是否应该 THAT 长?

编辑#1

EXPLAIN 已退回

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查询。

SHOW INDEX 返回

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 

3 个答案:

答案 0 :(得分:1)

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

SELECT sourceid FROM page USE INDEX (sourceid_index)

与sgehrig注释一样,如果使用了索引,请使用EXPLAIN进行检查?并分享结果?

EXPLAIN select sourceid from page

它也可以帮助分享索引的定义:

SHOW INDEX FROM page

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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