此问题与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 长?
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
答案 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服务器版本上检查查询?